そもそもApacheのgracefulは馴染みやすいと思いますが、nginxでの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が良さそう!と思いきや、
結局Nginxの親プロセスと子プロセスの動きを理解してなかったためそんな判断をしてしまったということです。これで起動スクリプトに先ほどのコマンドとnginx startを追記すれば、次回から/etc/init.d/nginx gracefulが使えるようになりますね!

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

カテゴリー: Nginx

adachin

1989年生まれのFindy/SRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化、分析基盤の運用などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTA/TechBullで未経験者にインフラのコーチング/コミュニティマネージャーとして立ち上げと運営をしている。また、過去「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

0件のコメント

コメントを残す

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