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 の複雑さを軽減できます。
モジュール設計:高度にモジュール化された機能により、ビジネス要件に基づいてコンポーネントを選択できるため、リソースを節約し、システムの柔軟性と効率性を向上させることができます。
ソリューションアーキテクチャ
ユーザーリクエスト:ユーザーがブラウザから HTTP リクエストを送信します。
NGINX:リクエストを受信します。 静的ファイルがリクエストされた場合、NGINX はファイルを直接返します。 リクエストが静的ファイルをリクエストしない場合、NGINX はリクエストを uWSGI に転送します。
uWSGI:リクエストを受信し、Web Server Gateway Interface (WSGI) プロトコルを使用してリクエストを Django に渡します。
Django:データベースクエリやテンプレートレンダリングなどを含むビジネスロジックを処理して、応答コンテンツを生成します。
レスポンス: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 がインストールされている。
NGINX がインストールされている。 NGINX のインストール方法については、「LNMP スタックをデプロイする」をご参照ください。
上記の前提条件がすべて満たされていることを確認してください。
手順 1:uWSGI をデプロイする
次のコマンドを実行して、uWSGI をインストールします。
sudo pip3 install uwsgi
次のコマンド出力は、uWSGI がインストールされたことを示しています。
次のコマンドを実行して、テストディレクトリを作成します。
この例では、
/home/myblog
ディレクトリが作成されます。 ビジネス要件に基づいてディレクトリを指定できます。sudo mkdir /home/myblog
次のコマンドを実行して、
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 キーを押してファイルを保存して閉じます。インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行し、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
次のコマンド出力が返されます。
コンピュータのブラウザのアドレスバーに
http://<インスタンスのパブリック IP アドレス>:8001
と入力して、テストプログラムファイルにアクセスします。次の図に示すページは、uWSGI 環境がデプロイされていることを示しています。
バックグラウンドで次の情報が返されます。
手順 2:Django をデプロイする
次のコマンドを実行して、Django をインストールします。
sudo pip3 install Django
次の図は、Django がインストールされていることを示しています。
インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、プロジェクトを作成します。
この例では、
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
次のコマンドを実行して、
settings.py
ファイルを開きます。sudo vim /home/myblog/uwsgi_project/uwsgi_project/settings.py
ALLOWED_HOSTS = [ ]
をALLOWED_HOSTS = ["*"]
に変更します。説明["*"]
は、すべての IP アドレスからのアクセスが許可されることを指定します。 ALLOWED_HOSTS パラメータを ["*"] に設定しないと、アクセスが拒否されます。 ビジネス要件に基づいて ALLOWED_HOSTS パラメータを構成してください。DATABASES
パラメータのコンテンツをコメントアウトします。重要DATABASES
パラメーターは、Django プロジェクトで使用されるデータベース設定を指定するために使用されます。この例では、データベースは使用されません。パラメーターの内容をコメントアウトする必要があります。実際のビジネスシナリオに基づいて DATABASES パラメータを構成できます。
Esc
キーを押して挿入モードを終了します。:wq
と入力して Enter キーを押し、ファイルを保存して閉じます。 次のコマンドを実行して、Django を起動します。cd /home/myblog/uwsgi_project sudo python3 manage.py runserver 0.0.0.0:8002
コンピュータのブラウザのアドレスバーに
http://<インスタンスのパブリック IP アドレス>:8002
と入力して、Django ページにアクセスします。
手順 3:Django と NGINX および uWSGI の統合を構成する
Django と NGINX および uWSGI を統合するには、NGINX と uWSGI の構成を順番に変更して、Django プロジェクト、NGINX、および uWSGI の場所またはバージョン情報を NGINX と uWSGI の構成ファイルに書き込む必要があります。
インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、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
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; } }
次の図は、上記の構成の場所を示しています。
次のコマンドを実行して、ログディレクトリを作成します。 uWSGI はバックグラウンドでデーモンとして実行され、出力をディレクトリ内のログファイルにリダイレクトします。
sudo mkdir -p /var/log/uwsgi/ # ディレクトリを実際のディレクトリに置き換えます。
次のコマンドを実行して、
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
サービスを再起動します。
次のコマンドを実行して、NGINX サービスを再起動します。
sudo systemctl restart nginx
uWSGI サービスを再起動します。
次のコマンドを実行して、実行中の uWSGI サービスを停止します。
ps aux |grep uwsgi sudo kill -9 13187 # 前の手順で取得したプロセス ID (PID) を指定します。 この例では、PID は 13187 です。
インスタンスのオペレーティングシステムに基づいて次のいずれかのコマンドを実行して、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
次のコマンド出力が返されます。
コンピュータのブラウザのアドレスバーに
http://<インスタンスのパブリック IP アドレス>:8002
と入力して、Django ページにアクセスします。説明プロジェクトをデプロイすると、Web サイトのホームページが表示されます。