Nginxの仕組みの詳細な説明

Nginxの仕組みの詳細な説明

Nginxの仕組み

Nginx はコアとモジュールで構成されています。

Nginx 自体は実際にはほとんど作業を行いません。HTTP リクエストを受信すると、設定ファイルを参照してリクエストをロケーション ブロックにマッピングするだけです。このロケーションに設定されたさまざまな命令によって、さまざまなモジュールが起動され、作業が完了します。したがって、このモジュールは Nginx の実際の労働者と見なすことができます。通常、ある場所の命令には、ハンドラー モジュールと複数のフィルター モジュールが含まれます (もちろん、複数の場所で同じモジュールを再利用できます)。ハンドラー モジュールはリクエストの処理と応答コンテンツの生成を担当し、フィルター モジュールは応答コンテンツを処理します。

ユーザーが独自のニーズに応じて開発したモジュールがサードパーティ モジュールです。 Nginx が非常に強力なのは、非常に多くのモジュールをサポートしているからです。

Nginx モジュールは構造的にコア モジュール、基本モジュール、サードパーティ モジュールに分かれています。

  • コアモジュール: HTTPモジュール、EVENTモジュール、MAILモジュール
  • 基本モジュール: HTTP アクセス モジュール、HTTP FastCGI モジュール、HTTP プロキシ モジュール、HTTP Rewrite モジュール。
  • サードパーティ モジュール: HTTP アップストリーム リクエスト ハッシュ モジュール、通知モジュール、HTTP アクセス キー モジュール。

Nginx モジュールは、機能に基づいて次の 3 つのカテゴリに分類されます。

  • ハンドラー(プロセッサ モジュール)。このタイプのモジュールは、リクエストを直接処理し、コンテンツの出力やヘッダー情報の変更などの操作を実行します。通常、ハンドラー プロセッサ モジュールは 1 つだけです。
  • フィルター(フィルター モジュール)。このタイプのモジュールは、主に他のプロセッサ モジュールによって出力されたコンテンツを変更し、最終的に Nginx によって出力します。
  • プロキシ (プロキシ クラス モジュール)。このタイプのモジュールは、Nginx の HTTP Upstream のようなモジュールです。これらのモジュールは主に FastCGI などのバックエンド サービスと対話して、サービス プロキシや負荷分散などの機能を実装します。

Nginx プロセス モデル

Nginx はデフォルトでマルチプロセス作業モードを使用します。Nginx が起動すると、マスター プロセスと複数のワーカー プロセスが実行されます。マスターは、プロセス グループ全体とユーザー間の対話インターフェイスとして機能します。プロセスを監視し、ワーカー プロセスを管理して、サービスの再起動、スムーズなアップグレード、ログ ファイルの置き換え、構成ファイルのリアルタイムでの有効化などの機能を実現します。ワーカーは基本的なネットワーク イベントを処理するために使用されます。ワーカーは平等であり、クライアントからの要求を処理するために競合します。

nginx のプロセス モデルを図に示します。

マスター プロセスを作成するときは、まずリッスンする必要があるソケット (listenfd) を作成し、次にマスター プロセスから複数のワーカー プロセスを fork() して、各ワーカー プロセスがユーザーが要求したソケットをリッスンできるようにします。一般的に、接続が入ると、すべてのワーカーが通知を受け取りますが、接続要求を受け入れることができるのは 1 つのプロセスのみで、他のプロセスは失敗します。これがいわゆる群れ現象です。 nginx は accept_mutex (ミューテックス ロック) を提供します。このロックを使用すると、1 つのプロセスのみが同時に accept に接続されるため、集団パニックの問題は発生しません。

まず、accept_mutex オプションをオンにします。accept_mutex を取得したプロセスのみが accept イベントを追加します。 nginx は、ngx_accept_disabled という変数を使用して、accept_mutex ロックを競合するかどうかを制御します。 ngx_accept_disabled = 単一の nginx プロセスの接続総数 / 8 - アイドル接続数。ngx_accept_disabled が 0 より大きい場合、accept_mutex ロックの取得は試行されません。ngx_accept_disable の値が大きいほど、放棄する機会が増え、他のプロセスがロックを取得する可能性が高くなります。受け入れない場合は、ワーカープロセスごとの接続数が制御され、他のプロセスの接続プールが活用されます。このようにして、nginx は複数のプロセス間の接続のバランスを制御します。

各ワーカー プロセスには独立した接続プールがあり、接続プールのサイズは worker_connections です。ここでの接続プールは実際には実際の接続を保存するわけではなく、worker_connections のサイズの ngx_connection_t 構造体の配列にすぎません。さらに、nginx は、リンク リスト free_connections を通じてすべてのアイドル状態の ngx_connection_t を保存します。接続が取得されるたびに、空き接続リンク リストから接続が取得され、使用後は空き接続リンク リストに戻されます。 nginx が確立できる接続の最大数は、worker_connections * worker_processes である必要があります。もちろん、ここで話題にしているのは最大接続数です。ローカル リソースへの HTTP リクエストの場合、サポートできる同時接続の最大数は、worker_connections * worker_processes です。HTTP をリバース プロキシとして使用する場合、同時接続の最大数は、worker_connections * worker_processes/2 になります。リバース プロキシ サーバーの場合、同時接続ごとにクライアントとの接続とバックエンド サービスとの接続が確立され、2 つの接続が占有されることになります。

NginxはHTTPリクエストを処理する

HTTP リクエストは、典型的なリクエスト応答型のネットワーク プロトコルです。 HTTP はファイル プロトコルなので、リクエスト ラインとリクエスト ヘッダーを解析し、レスポンス ラインとレスポンス ヘッダーを出力する場合、行ごとに処理することがよくあります。通常、接続が確立された後、データ行が読み取られ、リクエスト行に含まれるメソッド、uri、および http_version 情報が分析されます。次に、リクエスト ヘッダーを 1 行ずつ処理し、リクエスト メソッドとリクエスト ヘッダー情報に基づいて、リクエスト ボディの有無とリクエスト ボディの長さを判断し、リクエスト ボディを読み取ります。リクエストを受信した後、リクエストを処理して出力する必要があるデータを生成し、レスポンス行、レスポンス ヘッダー、レスポンス本文を生成します。応答がクライアントに送信された後、完全なリクエストが処理されます。

処理フローチャート:

上記はNginxの仕組みの詳しい説明です。Nginxの仕組みについてさらに詳しく知りたい方は、123WORDPRESS.COMの関連記事もぜひご覧ください!

以下もご興味があるかもしれません:
  • Nginx リバース プロキシと負荷分散の概念の理解とモジュールの使用
  • NGINX 権限制御ファイルのプレビューとダウンロードの実装原則
  • Lua モジュールを使用して WAF を実装する Nginx の原理の分析
  • Nginx プロセス管理とリロードの原則の詳細な説明
  • Nginx の基本概念と原則

<<:  Vue3 ベースのフルスクリーン ドラッグ アップロード コンポーネント

>>:  MySQLの比較演算子正規表現マッチングREGEXPの使用の詳細な説明

推薦する

MySQL で絵文字表現を挿入できない理由と解決策

失敗のシナリオMySQL データベースに絵文字表現を挿入するために JDBC を呼び出すと、例外ja...

Ubuntu で起動時に自動的に起動するシェル スクリプトを作成する (推奨)

スクリプトを書く目的は、さまざまなサービスを手動で起動しなくて済むようにすることです(怠惰のためでも...

Linux でプロセスを効果的に管理するための 8 つのコマンド

序文プロセス管理の役割:サーバーの健全性状態を判定する: プロセスの状態 (メモリ、CPU 占有率な...

Vue2.0/3.0 での provide と inject の使用例

目次1. provide/inject の用途は何ですか? 2. provide/injectの使い...

Linux の運用と保守で netstat の代わりに ss コマンドを使用する方法

序文Linux サーバーを操作および管理するときに、最もよく使用されるコマンドの 1 つが nets...

JavaScriptでフロアナビゲーションエフェクトを作成するプロセスの詳細な説明

目次この期間の目標1. 関数の実装1.1 構造層1.2 スタイルレイヤー1.3 行動層1.3.1 フ...

Windows サーバー ポートを開きます (例としてポート 8080 を使用します)

ポートとは何ですか?私たちが通常参照するポートは、物理的な意味でのポートではなく、具体的には TCP...

Linux での MySQL 5.1 および 5.7 のインストール チュートリアル

以下のコンテンツのオペレーティング システムは次のとおりです: Centos 6.7 yum で M...

アイデアがWebプロジェクトを公開した後、Tomcatサーバーがプロジェクトとそのソリューションを見つけることができません

概要プロジェクトは正常に作成され、正常にデプロイされましたが、以下に示すように、Tomcat サーバ...

Vue開発の詳細な説明 ソートコンポーネントコード

目次 <テンプレート> <ul class="コンテナ">...

Reactにおけるコンテキスト適用シナリオの分析

コンテキストの定義と目的コンテキストは、コンポーネント ツリーにプロパティを明示的に渡すことなく、コ...

個人的な意見: デザインについて語る

<br />最も実用的なものを選んで話しましょう。まず、勤務先の都市を慎重に選ぶ必要があ...

startup.bat をダブルクリックすると Tomcat がクラッシュする問題の解決方法の詳細な説明

Tomcat を学習したばかりのプログラマーにとって、これはよくある間違いです。 1. 環境変数の問...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

CSS を使用して複数の方法で下揃えを実装するサンプル コード

会社のビジネス要件により、次の図の赤い領域の効果を達成する必要があります。 効果の説明: 1. 赤い...