このページはどうやってNGINXを開始するかを示します。一旦実行して、停止あるいは再起動するように制御する方法を示します。
NGINXは通常/usr/bin/nginx
からコマンドラインから起動されます。
/usr/bin/nginx
/usr/bin/nginx -t -c ~/mynginx.conf -g "pid /var/run/nginx.pid; worker_processes 2;"
-?, -h |
ヘルプを出力する。 |
-v |
バージョンを出力する。 |
-V |
NGINXのバージョン、コンパイラのバージョン、および設定パラメータを出力する。 |
-t |
実行しません。単に設定ファイルをテストします。NGINX は正しい構文のあtめに設定をチェックし、設定で参照されたファイルを開こうとします。 |
-q |
設定のテスト中に、非エラーのメッセージを抑圧します。 |
-s signal |
マスタープロセスにシグナルを送信します: stop, quit, reopen, reload. (version >= 0.7.53) |
-p prefix |
プリフィックスのパスを設定します (デフォルト: /usr/local/nginx/ )。(version >= 0.7.53) |
-c filename |
デフォルトの代わりにどの設定ファイルをNGINXが使うべきかを指定します。 |
-g directives |
global ディレクティブを設定します。(version >= 0.7.4) |
注意
NGINX は2,3のコマンドライン パラメータのみを持ちます。他のソフトウェアシステムと違い、設定は完全に設定ファイルを通じて行われます(想像してみてください)。
既に実行中のNGINXを制御するには2つの方法があります。1つ目は -s
コマンドラインパラメータを付けてNGINXを再び呼ぶことです。例えば、/usr/bin/nginx -s stop
はNGINXサーバを停止するでしょう。(他の-s
オプションは前の章で指定されました)
二つ目のNGINXを制御する方法は、シグナルをNGINXのマスタープロセスに送信することです... デフォルトでは、NGINXはマスタープロセス id を /usr/local/nginx/logs/nginx.pid
へ書き込みます。コンパイル時の./configure
と一緒に、あるいは設定ファイル内のpid
ディレクティブを使って、パラメータを渡すことで変更することができます。
QUIT
(Graceful シャットダウン) シグナルを NGINX マスタープロセスに送信する方法です:
kill -QUIT $( cat /usr/local/nginx/logs/nginx.pid )
マスタープロセスは以下のシグナルを処理することができます:
TERM, INT | 高速シャットダウン |
QUIT | Graceful シャットダウン |
KILL | 頑固なプロセスを中断 |
HUP | 設定のリロード 新しいワーカープロセスを新しい設定で開始します Gracefully に古いワーカープロセスをシャットダウンします |
USR1 | ログファイルを再オープンします。 |
USR2 | その場で実行プログラムをアップグレードします |
WINCH | ワーカープロセスをgracefullyにシャットダウンします。 |
自身でワーカープロセスを制御する必要はありません。しかし、幾つかのシグナルもサポートします:
TERM, INT | 高速シャットダウン |
QUIT | Graceful シャットダウン |
USR1 | ログファイルを再オープンします。 |
NGINXは実行時に操作を制御するために使うことのできる2,3のシグナルをサポートします。
最も一般的なものは15で、単に実行中のプロセスを停止します:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
しかしもっと興味深いオプションは、NGINXの設定をその場で変更できることです(リロードの前に設定をテストするように注意してください):
2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf syntax is ok
2006/09/16 13:07:10 [info] 15686#0: the configuration file /etc/nginx/nginx.conf was tested successfully
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2213 0.0 0.0 6784 2036 ? Ss 03:01 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
NGINXがHUP
シグナルを受け取ると、設定ファイルをパース(存在すれば指定されたもの、そうでなければデフォルト)しようとし、新しい設定を適用しようとします(つまり、ログファイルを再オープンしソケットをlistenします)。成功すれば、NGINXは新しいワーカープロセスを実行し、古いワーカーにgracefulシャットダウンするように合図します。知らされたワーカーはlistenソケットを閉じますが、現在のクライアントの提供を続けます。全てのクライアントの提供の後で、古いワーカーはシャットダウンします。NGINXが新しい設定を適用できなかった場合は、古い設定を使って動作し続けます。
RequestForReviewCategory – (レビューのリクエスト: HUP時のワーカープロセスについて何が起こりますか?)-Olle)
NIGNXバイナリを新しいものと置き換える必要がある場合(新しいバージョンへアップグレードする場合、あるいはサーバモジュールを追加/削除する場合)、サービスのダウンタイム無しで行うことができます - 入ってくるリクエストは紛失されないでしょう)。
最初に、古いバイナリを新しいものに置き換え、その後マスタープロセスにUSR2シグナルを送信します。マスタープロセスは.pid
ファイルを.oldbin
(例えば、 /usr/local/nginx/logs/nginx.pid.oldbin
)に名前を変更し、その後新しいバイナリを実行します。これは入れ替わって新しいマスタープロセスと新しいワーカープロセスを開始します:
: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
33135 33126 nobody 0.0 1380 kqread nginx: worker process (nginx)
33136 33126 nobody 0.0 1368 kqread nginx: worker process (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
この時点で、NGINXの2つのインスタンスが実行中で、入ってくるリクエストをお互いに処理します。古いインスタンスを追い出す計画をするには、WINCH
シグナルを古いマスタープロセスに送信しなければなりません。そして、古いワーカープロセスはgracefullyにシャットダウンを開始するでしょう:
: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody 0.0 1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
しばらくした後で、古いワーカープロセスは全て終了し、新しいワーカープロセスが入ってくるリクエストを処理します。
: PID PPID USER %CPU VSZ WCHAN COMMAND
33126 1 root 0.0 1164 pause nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
この時点で、古いサーバはlistenソケットをまだ閉じていないので、以下のステップに従うことで、まだ古いサーバに戻ることができます:
HUP
シグナルを送信します - 設定ファイルをリロードせずにワーカープロセスを開始するでしょうQUIT
シグナルを送信しますTERM
シグナルを送信します。KILL
シグナルを送信します新しいマスタープロセスが終了した後で、古いマスタープロセスは.pid
ファイルから.oldbin
サフィックスを削除し、全てがアップグレードの試みの前と全く同じになります。
更新が成功し、新しいサーバを維持したい場合は、新しいサーバだけを実行中にしておくために古いマスタープロセスに QUITシグナルを送信します:
: PID PPID USER %CPU VSZ WCHAN COMMAND
: 36264 1 root 0.0 1148 pause nginx: master process /usr/local/nginx/sbin/nginx
: 36265 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
: 36266 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)
: 36267 36264 nobody 0.0 1364 kqread nginx: worker process (nginx)