Nginx のリロード プロセスの背後にある真実を探る

Nginx のリロード プロセスの背後にある真実を探る

本日の記事では、主にNginxのリロードプロセスについて紹介します。実は前回の記事では、nginx の設定ファイルを変更した際に、nginx -s reload コマンドを実行していました。このコマンドを実行する理由は、nginx の設定ファイルを古い nginx.conf 設定から新しい nginx.conf 設定にスムーズに更新しながら、nginx がサービスを停止せず、常に新しいリクエストを処理することを期待するためです。

このような機能は nginx にとって非常に必要ですが、 nginx -s reloadコマンドを実行した後にワーカー サブプロセスの数が増えることがあります。これは、古い構成で実行されているワーカー プロセスが長時間終了していないためです。ストリームを 4 層リバース プロキシとして使用する場合、このシナリオがより一般的になる可能性があります。

それでは、nginx のリロード プロセスを分析して、nginx が何を行うのかを調べてみましょう。優雅な退出と即時退出の違いは何ですか?

リロードプロセス

最初のステップは、nginx 構成ファイル nginx.conf を変更した後、マスター プロセスに HUP シグナルを送信することです。これは実際には、コマンド ラインでnginx -s reloadコマンドを実行するのと同じです。

HUP シグナルを受信した後、マスター プロセスは 2 番目のステップで設定ファイルの構文が正しいかどうかを確認します。つまり、nginx のマスター プロセスは 2 番目のステップでこのステップを必ず実行するので、nginx -s reload の前に nginx -t を実行して構文が正しいかどうかを確認する必要はありません。

nginx の設定構文が正しい場合、マスター プロセスは新しいリスニング ポートを開きます。マスター プロセスで新しいリスニング ポートを開く必要があるのはなぜですか? nginx.conf で 443 などの新しいリスニング ポートや、これまで開かれていなかったリスニング ポートが導入される可能性があり、すべてのワーカー プロセスはマスター プロセスの子プロセスであり、子プロセスは親プロセスの開かれたポートをすべて継承するためです。これは Linux オペレーティング システムによって定義されているため、3 番目のステップでは、マスター プロセスが、導入される可能性のある新しいリスニング ポートを開きます。

次に、マスター プロセスは新しい nginx.conf 構成ファイルを使用して新しいワーカー サブプロセスを開始しますが、古いワーカー サブプロセスはどうなるでしょうか?

5 番目のステップでは、新しいワーカー子プロセスを開始した後、マスタープロセスは古いワーカー子プロセスに QUIT 信号を送信します。QUIT 信号は、TERM 信号や INT 信号とは異なります。QUIT 信号は、子プロセスを正常に閉じるためのものです。このとき、順序に注意する必要があります。nginx はスムーズさを保証する必要があるため、最初に新しいワーカー子プロセスを開始し、次に古いワーカー子プロセスに QUIT 信号を送信する必要があります。

その後、古いマスター子プロセスは QUIT シグナルを受信した後、まずリスニング ハンドルを閉じます。つまり、この時点では、新しい接続は新しいワーカー子プロセスにのみ送信されます。そのため、それらの間には時間差がありますが、時間は非常に高速です。その後、リスニング ハンドルを閉じた後、プロセスは現在の接続を処理して終了します。

以下は、マシンを停止せずにリロードによって新しい構成がロードされる様子を示す図です。

reload は停止せずに新しい設定をロードします

元々、マスター プロセスには 4 つの緑色のワーカー サブプロセスがあり、古い構成を使用していました。nginx.conf 構成ファイルを変更すると、マスターに SIGHUP シグナルを送信するか、リロード コマンドを実行しました。すると、マスターは新しい構成ファイルを使用して 4 つの新しい黄色のワーカー サブプロセスを開始しました。この時点で、4 つの古い緑色のワーカー サブプロセスと 4 つの新しい黄色のワーカー サブプロセスが共存していました。その後、古いワーカー子プロセスは、接続が keeplive 要求であっても、確立された接続で要求を処理した後、通常は接続を閉じます。

ただし、異常な状況では、一部のリクエストに問題があり、クライアントが長時間処理できない場合、リクエストはワーカー サブプロセスに長時間残ります。この場合、ワーカー サブプロセスは長時間存在します。新しい接続はすでに黄色のワーカー サブプロセスで実行されているため、影響は大きくありません。影響を受けるのは、緑色のワーカー サブプロセスが長時間存在することですが、これは既存の接続にのみ影響し、新しい接続には影響しません。

私たちはそれに対して何ができるでしょうか?新しいバージョンでは、最大待機時間を意味する新しい構成 worker_shutdown_timeout が提供されます。これにより、マスター プロセスが新しい黄色のワーカー プロセスを開始した後、古いワーカー プロセスが終了していない場合は、時間切れ後に古いワーカー プロセスが強制的に終了します。

要約する

この記事では主に、Nginx が新しい構成ファイルをスムーズにアップグレードするプロセスについて説明します。ワーカー サブプロセスを適切にシャットダウンすることと、新しく構成されたワーカー サブプロセスを開始することの関係を理解すると、まれに発生する異常なシナリオをより適切に処理できるようになります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • nginx+php実行リクエストの動作原理の詳細な説明
  • Nginx設定の原理と実装プロセスの詳細な説明https
  • Nginx URL 書き換えメカニズムの原理と使用例
  • Nginx フォワードプロキシとリバースプロキシの違いと原理分析
  • Nginx サーバーの負荷分散と SSL の原理、SSL キー ペアの生成、Nginx 構成の SSL 操作の例
  • Nginxの仕組みの詳細な説明

<<:  Zabbix が MySQL のマスター/スレーブ状態を監視する方法の詳細な説明

>>:  forループ内のvarの問題の解決

推薦する

Linux のハードリンクとソフトリンクの区別

Linux には、2 種類のファイル接続があります。1 つは Windows のショートカットに似て...

React のグローバル状態管理の 3 つの基本メカニズムの調査

目次序文小道具コンテクスト州要約する序文最新のフロントエンド フレームワークはすべて、コンポーネント...

複数のパッケージソースから同時にパッケージをロードするようにnpmを設定する方法

目次1. ローカルストレージを構築する2. npmパッケージを作成し、プライベートリポジトリにアップ...

ElementUI コンポーネント el-dropdown (落とし穴)

選択して変更: クリックすると現在の値が表示され、ページ UI が表示され、CSS スタイルが変更さ...

この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

イベント委任を使用してメッセージ ボード機能を実装します。 <!DOCTYPE html>...

JavaScript の例におけるループの使用法の詳細な説明

退屈だったので、ループに関する簡単な演習をいくつかまとめてみました。JS を学び始めたばかりの方に役...

非表示のフォームテキストを表示するJavaScript

この記事では、フォームの隠しテキストを表示するためのJavaScriptの具体的なコードを参考までに...

AngularJSにおける括弧の役割の詳細な説明

1. 括弧の役割1.1 角括弧 [ ]属性名が角括弧で囲まれている場合、右側には式の値が割り当てられ...

Nginx で IP と IP 範囲をブロックする方法

前面に書かれたNginx は単なるリバース プロキシおよび負荷分散サーバーではなく、電流制限、キャッ...

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

Javascript 非同期プログラミング: Promise を本当に理解していますか?

目次序文基本的な使い方文法エラー処理プロミスチェーン呼び出し非同期と待機よく使われる方法1. Pro...

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

Vue3 ベースのスクリプト設定構文 $refs の使用

目次1. Vue2 構文2. Vue3の使用1. コンポーネントのref値を設定する2. コンポーネ...

docker 環境でのデータベース バックアップ (postgresql、mysql) のサンプル コード

目次posgresql バックアップ/リストアMySQL バックアップ/復元posgresql バッ...

大きな太陽の天気アイコンを純粋な CSS で記述する方法の例

効果効果図は以下のとおりです実装のアイデアDivは太陽の長方形の光と影を実現します前の疑似要素は、既...