コマンドライン

NGINXの開始、停止、および再起動

このページはどうやってNGINXを開始するかを示します。一旦実行して、停止あるいは再起動するように制御する方法を示します。

NGINXの開始

NGINXは通常/usr/bin/nginxからコマンドラインから起動されます。

NGINXの起動の基本的な例

/usr/bin/nginx

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の停止あるいは再起動

既に実行中の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 シグナルを送信します - 設定ファイルをリロードせずにワーカープロセスを開始するでしょう
  • ワーカープロセスをgracefullyにシャットダウンするために新しいマスタープロセスに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)