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, INTQuick shutdown
QUITGraceful shutdown
KILLHalts a stubborn process
HUP

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

USR1Reopen the log files
USR2Upgrade Executable on the fly
WINCHGracefully 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/#

カテゴリー: BlogNginx

あだちん

1989年生まれ。 ランサーズ/SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わり、他社インフラレスポンス改善、ランサーズでの副業、ansibleでのインフラコード化を推進し、未経験によるエンジニア勉強会なども実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/広報/VulsRepo init file,chatwork通知のコントリビュータでもある。現在はDocker開発環境の提供,AWSで新サービスのインフラ構築,PHPバージョンアップ,分析基盤を担当しておりDigdag,embulk,BigQueryを使いこなそうと奮闘中である。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください