すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:NGINX と uWSGI を使用して Django プロジェクトをデプロイする

最終更新日:Mar 08, 2025

Django は、さまざまな規模の Web アプリケーションの開発に使用される、機能豊富で効率的、かつ安全なフレームワークです。 Django は開発プロセスを加速し、アプリケーションの品質と安定性を確保します。このトピックでは、NGINX と uWSGI を使用して Linux Elastic Compute Service (ECS) インスタンスに Django プロジェクトをデプロイする方法について説明します。

メリット

Django プロジェクトをデプロイする場合、NGINX と uWSGI は高並列リクエストを効率的に処理し、静的リソースを迅速にプロビジョニングし、スムーズな運用を保証し、機密データを保護するためのセキュリティを強化できます。 また、NGINX と uWSGI はトラフィックのピークに対応するための柔軟なスケーリングをサポートしており、ユーザーエクスペリエンスと業務継続性を大幅に向上させます。

  • 高パフォーマンス:NGINX は多数の同時接続を処理でき、uWSGI は Python Web アプリケーションを効率的に実行できます。 NGINX と uWSGI の組み合わせにより、Django アプリケーションの迅速な応答が保証されます。

  • 容易な管理と構成:シンプルで直感的な構成構文により、さまざまなビジネス要件に合わせてインスタンスパラメータを迅速に構成および変更し、O&M の複雑さを軽減できます。

  • モジュール設計:高度にモジュール化された機能により、ビジネス要件に基づいてコンポーネントを選択できるため、リソースを節約し、システムの柔軟性と効率性を向上させることができます。

ソリューションアーキテクチャ

  1. ユーザーリクエスト:ユーザーがブラウザから HTTP リクエストを送信します。

  2. NGINX:リクエストを受信します。 静的ファイルがリクエストされた場合、NGINX はファイルを直接返します。 リクエストが静的ファイルをリクエストしない場合、NGINX はリクエストを uWSGI に転送します。

  3. uWSGI:リクエストを受信し、Web Server Gateway Interface (WSGI) プロトコルを使用してリクエストを Django に渡します。

  4. Django:データベースクエリやテンプレートレンダリングなどを含むビジネスロジックを処理して、応答コンテンツを生成します。

  5. レスポンス:Django は処理結果を uWSGI に送信します。 次に、uWSGI は処理結果を適切な形式にパッケージ化し、処理結果を NGINX に返送します。

クイックデプロイ

Terraform Explorer にアクセスし、「コード」タブで Terraform コードを表示して実行すると、Alibaba Cloud Linux インスタンスに NGINX と uWSGI を使用して Django プロジェクトを自動的にデプロイできます。

  • 既存の Alibaba Cloud Linux インスタンスに Django プロジェクトをデプロイする場合は、ecs_instance_id パラメータにインスタンスの ID を指定し、[初期デバッグ] をクリックしてから、[計画と適用] をクリックします。

  • 新しい Alibaba Cloud Linux インスタンスに Django プロジェクトをデプロイする場合は、ecs_instance_id パラメータの値を指定せず[初期デバッグ] をクリックしてから、[計画と適用] をクリックします。

前提条件

以下の要件を満たす ECS インスタンスが作成されていること。

  • ECS インスタンスで Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、CentOS 8、Ubuntu 18、Ubuntu 20、または Ubuntu 22 が実行されている。

  • ECS インスタンスにパブリック IP アドレスが自動的に割り当てられているか、Elastic IP アドレス (EIP) が関連付けられている。 詳細については、「パブリック帯域幅を有効にする」をご参照ください。

  • ポート 22、ポート 80、ポート 8001、およびポート 8002 を開くために、ECS インスタンスのセキュリティグループに着信ルールが追加されている。 セキュリティグループルールの追加方法については、「セキュリティグループルールを追加する」をご参照ください。

    説明
    • ポート 8001 は uWSGI サービスのテストに使用されます

    • ポート 8002 は Django プロジェクトのテストに使用されます

  • Python 3 がインストールされている。

    次のコマンドを実行して、インストールされている Python 3 のバージョンを確認します。 Python 3 がインストールされていない場合は、Python 3 をインストールします。 Python 3 のインストール方法については、「Python 環境をデプロイする」をご参照ください。

    python3 --version

    次のコマンド出力が返されます。

    image

  • NGINX がインストールされている。 NGINX のインストール方法については、「LNMP スタックをデプロイする」をご参照ください。

重要

上記の前提条件がすべて満たされていることを確認してください。

手順 1:uWSGI をデプロイする

  1. 次のコマンドを実行して、uWSGI をインストールします。

    sudo pip3 install uwsgi

    次のコマンド出力は、uWSGI がインストールされたことを示しています。

    image

  2. 次のコマンドを実行して、テストディレクトリを作成します。

    この例では、/home/myblog ディレクトリが作成されます。 ビジネス要件に基づいてディレクトリを指定できます。

    sudo mkdir /home/myblog
  3. 次のコマンドを実行して、test.py という名前のテストプログラムファイルを作成して開きます。

    cd /home/myblog
    sudo vim test.py

    I キーを押して挿入モードに入り、次のコンテンツをファイルにコピーします。

    def application(env,start_response):
            start_response('200 ok',[('Content-Type','text/html')])
            return [b"Hello World"]

    Esc キーを押し、:wq と入力して、Enter キーを押してファイルを保存して閉じます。

  4. インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行し、test.py が実行されてアクセスできるかどうかを確認します。

    • Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、または CentOS 8:

      sudo /usr/local/bin/uwsgi --http :8001 --wsgi-file test.py
    • Ubuntu 18、Ubuntu 20、または Ubuntu 22:

      sudo uwsgi --http :8001 --wsgi-file test.py

    次のコマンド出力が返されます。

    image

  5. コンピュータのブラウザのアドレスバーに http://<インスタンスのパブリック IP アドレス>:8001 と入力して、テストプログラムファイルにアクセスします。

    • 次の図に示すページは、uWSGI 環境がデプロイされていることを示しています。

      image

    • バックグラウンドで次の情報が返されます。

      image

手順 2:Django をデプロイする

  1. 次のコマンドを実行して、Django をインストールします。

    sudo pip3 install Django

    次の図は、Django がインストールされていることを示しています。 image

  2. インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、プロジェクトを作成します。

    この例では、uwsgi_project プロジェクトが作成されます。 ビジネス要件に基づいてプロジェクト名を指定できます。

    • Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、または CentOS 8:

      sudo /usr/local/bin/django-admin.py startproject uwsgi_project
    • Ubuntu 18、Ubuntu 20、または Ubuntu 22:

      sudo /usr/local/bin/django-admin startproject uwsgi_project
  3. 次のコマンドを実行して、settings.py ファイルを開きます。

    sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
    1. ALLOWED_HOSTS = [ ]ALLOWED_HOSTS = ["*"] に変更します。

      説明

      ["*"] は、すべての IP アドレスからのアクセスが許可されることを指定します。 ALLOWED_HOSTS パラメータを ["*"] に設定しないと、アクセスが拒否されます。 ビジネス要件に基づいて ALLOWED_HOSTS パラメータを構成してください。

      image

    2. DATABASES パラメータのコンテンツをコメントアウトします。

      image

      重要
      • DATABASES パラメーターは、Django プロジェクトで使用されるデータベース設定を指定するために使用されます。この例では、データベースは使用されません。パラメーターの内容をコメントアウトする必要があります。

      • 実際のビジネスシナリオに基づいて DATABASES パラメータを構成できます。

  4. Esc キーを押して挿入モードを終了します。 :wq と入力して Enter キーを押し、ファイルを保存して閉じます。 次のコマンドを実行して、Django を起動します。

    cd /home/myblog/uwsgi_project
    sudo python3 manage.py runserver 0.0.0.0:8002
  5. コンピュータのブラウザのアドレスバーに http://<インスタンスのパブリック IP アドレス>:8002 と入力して、Django ページにアクセスします。

    image

手順 3:Django と NGINX および uWSGI の統合を構成する

Django と NGINX および uWSGI を統合するには、NGINX と uWSGI の構成を順番に変更して、Django プロジェクト、NGINX、および uWSGI の場所またはバージョン情報を NGINX と uWSGI の構成ファイルに書き込む必要があります。

  1. (オプション) Django プロジェクトをデプロイするには、オンプレミスのプロジェクトを ECS インスタンスにアップロードし、Django の構成を変更します。 次の手順を実行します。

    重要

    このトピックのソリューションの実現可能性をテストするために基本的な Django Web ページのみを表示する場合は、次の手順をスキップしてください。

    1. オンプレミスのプロジェクトを ECS インスタンスにアップロードします。 詳細については、「SFTP を使用してファイルをアップロードおよびダウンロードする」をご参照ください。

    2. 次のコマンドを実行して、settings.py という名前の Django 構成ファイルを変更します。

      # この例では、プロジェクト名は uwsgi_project です。
      sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
    3. I キーを押して挿入モードに入ります。

    4. DEBUG = TrueDEBUG = False に変更します。

      image

    5. 次のパラメータを settings.py ファイルの先頭に追加します。

      import os

      なぜ import os パラメーターを追加するのですか?

      • スコープ定義: os モジュールが settings.py ファイル全体で使用可能であることを確認します。ファイルの中央または最後に os をインポートすると、os がインポートされる前に os が使用されている場所で NameError 例外がスローされます。

      • パフォーマンスの最適化:インタープリターは、import 文が表示されたときに解析するのではなく、import 文を 1 回だけ解析する必要があります。

    6. 次のパラメータを settings.py ファイルの最後に追加します。

      STATIC_ROOT = os.path.join(BASE_DIR, "static/")

      なぜ STATIC_ROOT = os.path.join(BASE_DIR, "static/") パラメーターを追加するのですか?

      • 静的ファイルのコレクション: STATIC_ROOT は、Django が本番環境の Web サーバー用にカスケードスタイルシート (CSS)、JavaScript、イメージなどのすべての静的ファイルを収集する絶対パスを指定するために使用されます。ほとんどの場合、このパラメーターは以前に定義された変数に依存するため、ファイルの最後に配置されます。

      • 循環参照の回避:特定の設定が他の設定に依存している場合は、ファイル内の異なる場所に設定を配置して、潜在的な循環参照の問題を回避します。

    7. Esc キーを押し、:wq と入力して、Enter キーを押してファイルを保存して閉じます。

    8. 次のコマンドを実行して、すべての静的ファイルを収集します。

      sudo python3 manage.py collectstatic 

      image

  2. インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、NGINX 構成ファイルを開きます。

    • Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、または CentOS 8:

      sudo vim /etc/nginx/nginx.conf
    • Ubuntu 18、Ubuntu 20、または Ubuntu 22:

      sudo vim /etc/nginx/sites-enabled/default
  3. I キーを押して挿入モードに入ります。 server セクションで、次のパラメータを追加または変更します。

        upstream django {
            # uWSGI 構成ファイルで構成したポートを使用します。
            server 127.0.0.1:8001; 
        }
        server {
            # ポートを構成します。
            listen       8002; 
            server_name  test;
            charset      utf-8;
            location /static {
                # ディレクトリリストを有効にします。
                autoindex on;
                # 静的ファイルの絶対パスを指定します。 ビジネスシナリオに基づいてパスを変更します。
                alias /home/myblog/uwsgi_project/static; 
            }
    
            location / {
                # リクエストを uWSGI サーバーに渡します。 指定されたアドレスは、upstream セクションで定義されたアドレスである必要があります。
                uwsgi_pass 127.0.0.1:8001;
                # uWSGI パラメータ構成を含めます。
                include uwsgi_params; 
                # NGINX に付属の uWSGI パラメータファイルを含めます。 ディレクトリを実際のディレクトリに置き換えます。
                include /etc/nginx/uwsgi_params; 
                # デフォルトのインデックスファイルを指定します。
                index index.html index.htm;
                client_max_body_size 35m;
            }
        }

    次の図は、上記の構成の場所を示しています。image

  4. 次のコマンドを実行して、ログディレクトリを作成します。 uWSGI はバックグラウンドでデーモンとして実行され、出力をディレクトリ内のログファイルにリダイレクトします。

    sudo mkdir -p /var/log/uwsgi/  # ディレクトリを実際のディレクトリに置き換えます。

  5. 次のコマンドを実行して、uwsgi_config.ini uWSGI 構成ファイルを作成します。

    sudo vim uwsgi_config.ini

    I キーを押して挿入モードに入り、次のパラメータをファイルに追加します。 Esc キーを押し、:wq と入力して、Enter キーを押してファイルを保存して閉じます。

    [uwsgi]
    # NGINX 構成ファイルで構成した uwsgi_pass ポートを使用します。 この例では、ポート 8001 が使用されます。
    socket = 127.0.0.1:8001  
    # プロジェクトディレクトリを指定します。 ディレクトリをプロジェクトの実際のディレクトリに置き換えます。
    chdir = /home/myblog/uwsgi_project/  
    # Django の .wsgi ファイルを指定します。 プロジェクトに基づいてパラメータを構成します。
    wsgi-file = uwsgi_project/wsgi.py  
    # ワーカープロセスの最大数を指定します。
    processes = 4  
    # 各ワーカープロセスの起動後に起動するスレッドの数を指定します。
    threads = 2  
    # 終了時に環境をクリアします。
    vacuum = true  
    # uWSGI パケットの解析に使用されるバッファのサイズを指定します。 この例では、バッファのサイズは 64k に設定されています。 デフォルト値:4k。
    buffer-size = 65536  
    # ログファイルを保存する書き込み可能なディレクトリを指定します。 実際のプロジェクトに基づいてディレクトリを変更できます。
    daemonize = /var/log/uwsgi/uwsgi_project.log  
    # スレッドのサポートが有効になっていることを確認します。
    enable-threads = true                           
  6. サービスを再起動します。

    1. 次のコマンドを実行して、NGINX サービスを再起動します。

      sudo systemctl restart nginx
    2. uWSGI サービスを再起動します。

      1. 次のコマンドを実行して、実行中の uWSGI サービスを停止します。

        ps aux |grep uwsgi
        sudo kill -9 13187 # 前の手順で取得したプロセス ID (PID) を指定します。 この例では、PID は 13187 です。

        image

      2. インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、uWSGI サービスを起動します。

        • Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、または CentOS 8:

          uwsgi --ini uwsgi_config.ini
        • Ubuntu 18、Ubuntu 20、または Ubuntu 22:

          sudo uwsgi --ini uwsgi_config.ini

        次のコマンド出力が返されます。

        image

  7. コンピュータのブラウザのアドレスバーに http://<インスタンスのパブリック IP アドレス>:8002 と入力して、Django ページにアクセスします。

    説明

    プロジェクトをデプロイすると、Web サイトのホームページが表示されます。

    image

FAQ

uWSGI のインストール時にエラーが発生した場合はどうすればよいですか?

インストールプロセス中に次の図に示すようなエラーメッセージが表示された場合は、オペレーティングシステムに基づいて次のいずれかのコマンドを実行して、uWSGI を再インストールします。

  • Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、CentOS 7、または CentOS 8:

    sudo yum -y install python3-devel.x86_64
  • Ubuntu 18、Ubuntu 20、または Ubuntu 22:

    sudo apt -y install python3-devel.x86_64

image