NGINX Unit は、複数の言語と各言語の複数のバージョンを提供できる完全に動的なアプリケーション サーバーです。 これは、サービスの中断や構成の再読み込みなしに、RESTful JSON API を使用してメモリ内の構成を変更するという意味で動的です。
10 月に開催されたNGINX Conf 2018でのプレゼンテーションでは、既存の本番環境で新しいアプリケーションを構成する方法を紹介しました。 具体的には、PHP 上で実行される WordPress に、Django フレームワークを使用する Python アプリケーションをデプロイしました。 また、ファイルから構成をロードする方法と、API 呼び出しの引数で指定された構成をロードする方法も示しました。
このブログには、デモで使用したすべてのコマンドと構成コードが含まれているため、独自の展開に簡単に適応できます。
NGINX Conf のデモでは、次のソフトウェアをインストールしました。
ルート
権限、またはsudo
による同等のアクセス(必要に応じて使用)既存のアプリケーションとして PHP と WordPress もインストールしました。
Django プロジェクトを作成するディレクトリに移動します。
$ cd /var/www/
新しいプロジェクトを初期化するには、 django-admin
startproject
コマンドを使用します。 私たちはそれをdjappと呼んでいます。
$ sudo django-admin startproject djapp
プロジェクト ディレクトリに変更します。
$ cd djapp
新しく作成されたプロジェクトに必要なプロジェクトのデータベースを移行するには、 manage.py
スクリプトを使用します。 Django はデフォルトで SQLite を使用します。デモではデフォルトを受け入れていますが、プロジェクトのニーズを満たす任意のデータベースを使用できます。
manage.py
スクリプトは、手順 2 で実行したdjango-admin
コマンドによってインストールされます。このスクリプトはdjango-admin
と同じコマンドを実行し、同じ引数を受け入れますが、プロジェクト固有の設定を自動的に導出して使用するので便利です。 詳細については、 Django のドキュメントを参照してください。
$ sudo python3 manage.py 移行
このようなサンプル プロジェクトでは厳密には必要ありませんが、DjangoスーパーユーザーID を作成することをお勧めします。
$ sudo python3 manage.py スーパーユーザーを作成します
手順 2 でdjango-admin
startproject
コマンドによって作成されたsettings.pyファイルを含むサブディレクトリに移動します。
$ cd /var/www/djapp/djapp
好みのテキスト エディターを使用して、 settings.pyを開きます。 ここではnano を
使用しています:
$ sudo ナノ設定.py
ALLOWED_HOSTS
行を見つけて、アプリケーションのドメイン名、ホスト名、または IP アドレスを追加します。
ALLOWED_HOSTS = ['ドメイン名']
また、ファイルの最後に次の行を追加して、アプリケーションによって提供されるすべての静的コンテンツを保存するディレクトリに名前を付けます (手順 9 を参照)。
STATIC_ROOT = '/var/www/djapp/djapp/static'
メイン プロジェクト ディレクトリ ( manage.py が存在する場所) に戻ります。
$ cd ..
manage.py
collectstatic
コマンドを実行して、Django プロジェクトにあるすべての静的ファイルを収集し、手順 7 で定義したSTATIC_ROOT
の場所に配置します。
$ sudo python3 manage.py collectstatic
デフォルトでは、Django 自体がプロジェクトの静的コンテンツを提供しますが、NGINX Open Source と NGINX Plus は優れたパフォーマンスを提供します。 ここでは NGINX Plus を設定しますが、以下に示す 1 つの機能を除いて NGINX Open Source を使用することもできます。
機能固有(またはこの場合はアプリケーション固有)の HTTP 構成ファイルの通常の場所である/etc/nginx/conf.dにディレクトリを変更します。
$ cd /etc/nginx/conf.d
django.confというファイルを作成します (ここでもnano を
使用します)。
$ sudo ナノ django.conf
キャッシュを有効にする次の構成を挿入します。
この構成には、NGINX Plus 専用の 2 つの機能も含まれています。 NGINX Plus を使用しており、その機能を活用したい場合は、関連するディレクティブのコメントを解除します。
status_zone
ディレクティブによってこの仮想サーバーに対して有効にされた拡張メトリック収集。 NGINX Plus API は構成内の他の場所で有効になっていると想定しています。health_check
ディレクティブによって有効になるアクティブなヘルスチェック。注目すべき点の 1 つは、NGINX Conf のデモでは、 proxy_set_header
ディレクティブの 2 番目の引数としてローカル マシンの IP アドレスを指定したことです。 実稼働環境では、以下に示すように$host
変数を使用する方が合理的です。
# バックエンドのアップストリーム グループ (Python アプリケーションを実行する NGINX Unit)
upstream django_unit {
zone django_unit 64k;
server 127.0.0.1:8000;
}
server {
listen 8080;
# NGINX Plus と NGINX Plus API を使用している場合は、コメントを解除してメトリックを収集します
#status_zone django;
# キャッシュを有効にします
proxy_cache django_cache;
proxy_cache_valid 200 60m;
# 静的ファイルのルート ディレクトリ
root /var/www/djapp/djapp;
# NGINX Unit バックエンドへのプロキシ
location / {
proxy_pass http://django_unit;
# 2 番目の引数は、本番環境のホスト名と、settings.py の ALLOWED_HOSTS の値と一致する必要があります
proxy_set_header Host $host;
# NGINX Plus を使用している場合は、コメントを解除してアクティブ ヘルス チェックを有効にします
#health_check;
}
# Django から収集され、
# NGINX Plus によって提供される静的ファイルの場所。親ブロックから
# 'root' ディレクティブの値を継承するため、空にすることができます (ここのように)
location /static {
}
}
構成の構文の妥当性を確認します。
$ sudo nginx –t
エラーを修正したら、構成を再ロードします。
$ sudo nginx -s リロード
最後に、アプリケーションへのリクエストを処理するように NGINX Unit を構成する必要があります。
このcurl
コマンドを実行すると、PHP 上で実行されている WordPress の現在の NGINX Unit 構成が表示されます。 ここでは出力を示しませんが、WordPress の設定は、これから追加する Python アプリケーションの設定とともに、以下の手順 6 に表示されます。
curl
コマンドにはsudo を
使用していることに注意してください。ほとんどのcurl
コマンドではこれを行う必要はありません。 ここでこれが必要になるのは、UNIX ソケットにアクセスするには、 root
が持つ読み取り/書き込み権限が必要だからです。
$ sudo curl --unix-socket /run/control.unit.sock http://localhost/config/
NGINX Unit 構成ファイルのディレクトリに変更します。
これらのファイルはオプションであり、NGINX Unit API 呼び出しの引数としてすべてのデータを入力せずに構成のコレクションをロードするための便利な方法にすぎないことに注意してください。ファイルの内容は API を介してアップロードされるため (すべての構成データと同様に)、NGINX Unit はファイルの場所を認識せず、起動時にファイルを自動的に読み取ることができません (NGINX Open Source や NGINX Plus とは異なります)。 代わりに、NGINX Unit はランタイム状態を別のディレクトリに保存します。
$ cd /etc/ユニット
django.configというファイルを作成します (ここでもnano を
使用します)。
$ sudo ナノ django.config
Python アプリケーションを表す次の JSON を追加します。
{
"type": "python",
"processes": 5、「モジュール」:「djapp.wsgi」、「パス」:「/var/www/djapp」 }
このcurl
コマンドを実行して、 django.configに含まれる JSON を、NGINX Unit によって管理されるdjappという新しいアプリケーション オブジェクトとして読み込みます。
$ sudo curl -X PUT --data-binary @/etc/unit/django.config --unix-socket /run/control.unit.sock http://localhost/config/applications/djapp
このコマンドでは、
PUT
メソッドは、最後の引数 (URL) で指定された場所に新しい NGINX Unit 構成オブジェクトを作成します。 下の最後の箇条書きを参照してください。--data-binary
引数は、curl に、
提供されたとおりにdjango.configの内容をロードし、改行と復帰を保持し、いかなる種類の処理も実行しないように指示します。--unix-socket
引数は、NGINX Unit API がリッスンする場所を定義します。 (ソケットのデフォルトの所有者であるroot を
使用しているため、 sudo
コマンドを使用します。)は
最上位の NGINX Unit 構成オブジェクト、 applications は
アプリケーション オブジェクトの親、 djapp は
新しいアプリケーション オブジェクトの名前です。アプリケーションのリスナー オブジェクトを定義します。 手順 4 のように構成データのファイルをロードするのではなく、 curl
コマンド ラインで直接データを定義し、 djapp
アプリケーションがポート 8000 でリッスンするように指定します。
$ sudo curl -X PUT --data-binary '{"application":"djapp"}' --unix-socket /run/control.unit.sock 'http://localhost/config/listeners/*:8000'
手順 1 のcurl
コマンドを繰り返して NGINX ユニット構成を表示します。これには、オレンジ色で強調表示された Python アプリケーションdjapp が含まれています。
$ sudo curl --unix-socket /run/control.unit.sock http://localhost/config/ { "listeners": { "127.0.0.1:8090": { "application": "script_index_php" }, "127.0.0.1:8091": { "application": "direct_php" }, "*:8000": { "application": "djapp" } }, "applications": { "script_index_php": { "type": "php", "processes": { "max": 20、「スペア」: 5 }, "user": "www-data", "group": "www-data", "root": "/var/www/wordpress", "script": "index.php" }, "direct_php": { "type": "php", "processes": { "max": 5、「スペア」: 0 }, "ユーザー": "www-data", "グループ": "www-data", "ルート": "/var/www/wordpress", "インデックス": "index.php" }, "djapp": { "タイプ": "python", "プロセス": 5、「モジュール」:「djapp.wsgi」、「パス」:「/var/www/djapp」 } } }
この投稿では、本番環境で WordPress 用の PHP アプリケーションを実行する NGINX Unit から始めて、Python アプリケーションを追加しました。 デモでは、NGINX Plus ダッシュボードを使用して、新しいアプリケーションが追加されても既存のアプリケーションに中断がないことを示していますが、この目的にはps
コマンドなどの任意のシステム監視ツールを使用することもできます。 NGINX ユニット構成の動的な性質により、実行中のアプリケーションのリソースが節約され、新しいデプロイメントでのダウンタイムがゼロになり、アプリケーション バージョン間のスムーズな移行が保証されます。
詳細については、 unit.nginx.org をご覧ください。
「このブログ投稿には、入手できなくなった製品やサポートされなくなった製品が参照されている場合があります。 利用可能な F5 NGINX 製品およびソリューションに関する最新情報については、 NGINX 製品ファミリーをご覧ください。 NGINX は現在 F5 の一部です。 以前の NGINX.com リンクはすべて、F5.com の同様の NGINX コンテンツにリダイレクトされます。"