そもそもApacheのgracefulは馴染みやすいと思いますが、nginxでのgracefulって起動スクリプトにない!?イマイチよくわかっていなかったのでブログします。まずは、restartとgracefulの違いについて紹介します。
■restart
クライアントとの通信が強制的に切断してしまい、
クライアントにご迷惑をお掛けしてしまう。
■graceful
すべてのクライアントとの通信が終了するまで再起動しない!
再起動したとしてもゆるやかに。
つまりrestartはプロセスを強制的にkillして、gracefulは様子見てkillしてる感じです。
■Apacheでのgraceful
基本起動スクリプトを見ればそれぞれのgracefulがどうやって再起動しているのか確認できます。
1 2 |
$ less /etc/init.d/httpd apachectl -k graceful |
結局、apachectlコマンドでgracefulしているのが分かります。
■じゃあnginxのgracefulはどうやっているのか
Here’s how to send the QUIT (Graceful Shutdown) signal to the NGINX master process:
訳:nginxのマスター・プロセスにQUIT(gracefulな停止)信号を送る方法は次のとおりです。
1 2 3 4 5 |
# kill -QUIT $( cat /usr/local/nginx/logs/nginx.pid ) # /etc/init.d/nginx start or # kill -QUIT $( cat /var/run/nginx.pid ) # /etc/init.d/nginx start |
- QUIT以外のコマンド
TERM, INT | Quick shutdown |
QUIT | Graceful shutdown |
KILL | Halts a stubborn process |
HUP |
Configuration reload |
USR1 | Reopen the log files |
USR2 | Upgrade Executable on the fly |
WINCH | Gracefully shutdown the worker processes |
- 訳
シグナル名 | 動作 |
---|---|
TERM, INT | 即座にシャットダウン |
QUIT | グレイスフルなシャットダウン |
KILL | しぶといプロセスを停止させる |
HUP | 設定のリロード |
USR1 | ログファイルを再オープンする |
USR2 | 実行ファイルをオンザフライで更新する |
WINCH | ワーカープロセスをグレイスフルにシャットダウンする |
■まとめ
gracefulなシャットダウンって結局プロセスkillするからプロセスなくなるんじゃないのか!?と勘違いしてHUPが良さそう!と思いきや、
結局Nginxの親プロセスと子プロセスの動きを理解してなかったためそんな判断をしてしまったということです。これで起動スクリプトに先ほどのコマンドとnginx startを追記すれば、次回から/etc/init.d/nginx gracefulが使えるようになりますね!
参考:https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/#
0件のコメント