Adachinですっ。

そもそもapacheのgracefulは馴染みやすいと思いますが、

nginxでのgracefulって起動スクリプトにない!?

どうやってgracefulするんだああ!!!

イマイチよくわかっていなかったのでブログします。

まずは、restartとgracefulの違いについて紹介します。


■restart

クライアントとの通信が強制的に切断してしまい、
クライアントにご迷惑をお掛けしてしまう。

■graceful

すべてのクライアントとの通信が終了するまで再起動しない!
再起動したとしてもゆるやかに。

つまりrestartはプロセスを強制的にkillして、
gracefulは様子見てkillしてる感じです。


■apacheでのgraceful

基本起動スクリプトを見ればそれぞれのgracefulがどうやって再起動しているのか確認できます。

結局、apachectlコマンドでgracefulしているのが分かります。


■じゃあnginxのgracefulはどうやっているのか

とりあえず公式でググってみた。

Here’s how to send the QUIT (Graceful Shutdown) signal to the NGINX master process:

訳:nginxのマスター・プロセスにQUIT(gracefulな停止)信号を送る方法は次のとおりです。

・QUIT以外のコマンド

※枠が出なくてゴメンナサイ(泣)

TERM, INT Quick shutdown
QUIT Graceful shutdown
KILL Halts a stubborn process
HUP

Configuration reload
Start the new worker processes with a new configuration
Gracefully shutdown the old worker processes

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がいいと思います!と
先輩に伝えたら、爆笑され、怒られましたがw
結局nginxの親プロセスと子プロセスの
動きを理解してなかったためそんな判断をしてしまったということです。

これで起動スクリプトに先ほどのコマンドとnginx startを追記すれば、
次回から/etc/init.d/nginx gracefulが使えるようになりますね!

参考:https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/#

The following two tabs change content below.
あだちん

あだちん

1989年生まれ。 Infra engineer/Site Reliability Engineering。 エンジニアぽくないとも言われる。 2013年新卒に自宅サーバを構築し、この技術ブログを立ち上げたが、 2017年に電源がお亡くなりConoHaにリプレイスした。 好きな構成管理ツールはansible,Terraform。 仮想化ならdocker。Python初心者。 HIPHOPが好きすぎてTrack Makerでもある。

コメントを残す