検索
ホームページ運用・保守Nginxnginx リクエストを処理するにはどうすればよいですか?

nginx リクエストを処理するにはどうすればよいですか?

今日はリクエストについて話します。Nginx では http リクエストを指します。Nginx の具体的なデータ構造は ngx_http_request_t です。 ngx_http_request_t は http リクエストのカプセル化です。 http リクエストには、リクエスト行、リクエスト ヘッダー、リクエスト本文、応答行、応答ヘッダー、および応答本文が含まれることがわかっています。

http リクエストは典型的なリクエスト/レスポンス型のネットワーク プロトコルであり、http はテキスト プロトコルであるため、リクエスト行とリクエスト ヘッダーを分析し、応答行と応答ヘッダーを 1 行ずつ出力します。と。 (推奨される学習: nginx の使用)

http サーバーを自分で作成する場合、通常は接続が確立された後、クライアントがリクエストを送信します。次に、データ行を読み取り、リクエスト行に含まれるメソッド、URI、および http_version 情報を分析します。

その後、リクエストヘッダを一行ずつ処理し、リクエストメソッドとリクエストヘッダ情報からリクエストボディの有無とリクエストボディの長さを判断し、リクエストボディを読み込みます。

リクエストを取得した後、リクエストを処理して出力する必要のあるデータを生成し、応答行、応答ヘッダー、応答本文を生成します。

応答をクライアントに送信した後、完全なリクエストが処理されます。もちろん、これは最も単純な Web サーバーの処理方法ですが、実際には、リクエスト ヘッダーが読み取られるとリクエストの処理が開始されるなど、いくつかの小さな違いはありますが、Nginx でもこれが行われます。 Nginx は ngx_http_request_t を使用して、リクエストの解析と出力レスポンスに関連するデータを保存します。

次に、Nginx が完全なリクエストをどのように処理するかについて簡単に説明します。 Nginx の場合、リクエストは ngx_http_init_request から始まりますが、この関数では読み取りイベントを ngx_http_process_request_line に設定しており、次のネットワーク イベントは ngx_http_process_request_line で実行されます。

ngx_http_process_request_line の関数名から、リクエストラインを処理するものであることが分かりますが、前述の通り、リクエストを処理するにはまずリクエストラインの処理が必要です。

ngx_http_read_request_header を通じてリクエスト データを読み取ります。次に、ngx_http_parse_request_line 関数が呼び出されて、リクエスト行が解析されます。効率を向上させるために、Nginx はステート マシンを使用してリクエスト ラインを解析します。メソッドを比較するときに、文字列比較を直接使用するのではなく、4 つの文字を整数に変換してから 1 回比較して、CPU 命令の数を削減します。 . これは以前にも言われたことです。

多くの人は、リクエスト行にリクエスト メソッド、URI、バージョンが含まれていることは知っているかもしれませんが、リクエスト行にホストも含まれることは知りません。たとえば、GET http://www.taabao.com/uri HTTP/1.0 のようなリクエストも正当であり、ホストは www.taabao.com です。このとき、Nginx はリクエスト ヘッダーのホスト フィールドを無視し、 use これをリクエスト行で使用して、仮想ホストを検索します。

また、http0.9 バージョンではリクエスト ヘッダーがサポートされていないため、ここでは特別な処理が必要です。したがって、後でリクエスト ヘッダーを解析するとき、プロトコル バージョンは 1.0 または 1.1 になります。リクエスト行全体から解析されたパラメータは、ngx_http_request_t 構造に保存されます。

リクエストラインを解析した後、Nginx は読み取りイベントのハンドラーを ngx_http_process_request_headers に設定し、後続のリクエストは ngx_http_process_request_headers で読み取られて解析されます。

ngx_http_process_request_headers 関数は、リクエスト ヘッダーの読み取りに使用されます。リクエスト行と同様に、ngx_http_read_request_header を呼び出してリクエスト ヘッダーを読み取り、ngx_http_parse_header_line を呼び出してリクエスト ヘッダーの行を解析します。解析されたリクエスト ヘッダーは次の場所に保存されます。 ngx_http_request_t. のドメイン headers_in 、 headers_in はすべてのリクエスト ヘッダーを保存するリンク リスト構造です。

HTTP の一部のリクエストには特別な処理が必要です。これらのリクエスト ヘッダーとリクエスト処理関数は、マッピング テーブル、つまり ngx_http_headers_in に保存されます。初期化中にハッシュ テーブルが生成されます。リクエストが解析されるとき、リクエスト後、ヘッダーを含む場合は、まずハッシュ テーブルを検索し、見つかった場合は、対応する処理関数を呼び出してリクエスト ヘッダーを処理します。例: Host ヘッダーの処理関数は ngx_http_process_host です。

Nginx が 2 つのキャリッジ リターンとライン フィードを解析すると、リクエスト ヘッダーの終わりが示され、この時点で ngx_http_process_request が呼び出され、リクエストが処理されます。

ngx_http_process_request は、現在の接続の読み取りおよび書き込みイベント処理関数を ngx_http_request_handler に設定し、ngx_http_handler を呼び出して実際に完全な http リクエストの処理を開始します。

ここで奇妙かもしれません。読み取りイベント処理関数と書き込みイベント処理関数は両方とも ngx_http_request_handler です。実際、この関数では、現在のイベントが読み取りイベントかどうかに応じて、ngx_http_request_t の read_event_handler または write_event_handler がそれぞれ呼び出されます。または書き込みイベント。

この時点で、リクエスト ヘッダーが読み取られているためです。前述したように、Nginx のアプローチは最初にリクエスト本文を読み取ることではないため、ここでは read_event_handler を ngx_http_block_reading に設定します。つまり、データは読み取られません。

先ほど述べたように、データ処理の本当の開始は ngx_http_handler 関数であり、この関数は write_event_handler を ngx_http_core_run_phases に設定し、ngx_http_core_run_phases 関数を実行します。

ngx_http_core_run_phases Nginx では http リクエストの処理を複数の段階に分けて実行し、データを生成する多段階のリクエスト処理を行う関数です。

ngx_http_core_run_phases は最終的にデータを生成するため、書き込みイベントの処理関数が ngx_http_core_run_phases に設定される理由は簡単に理解できます。

ここで、関数の呼び出しロジックを簡単に説明します。リクエストを処理するために最終的に ngx_http_core_run_phases が呼び出されることを理解する必要があります。生成されたレスポンス ヘッダーは、ngx_http_request_t の headers_out に配置されます。この部分を記述します。リクエスト処理プロセスで説明しましょう。 Nginx のさまざまな段階でリクエストが処理され、最後にフィルターを呼び出してデータをフィルタリングし、切り捨てられた送信や gzip 圧縮などのデータを処理します。

ここでのフィルターには、応答ヘッダーまたは応答本文を処理するヘッダー フィルターと本文フィルターが含まれます。フィルターはヘッダーフィルターとボディフィルターのリンクリスト構造になっており、ヘッダーフィルター内のすべてのフィルターが最初に実行され、次にボディーフィルター内のすべてのフィルターが実行されます。

ヘッダー フィルターの最後のフィルターは ngx_http_header_filter です。このフィルターはすべての応答ヘッダーをスキャンします。出力する必要がある最後の応答ヘッダーは連続メモリ内にあり、出力のために ngx_http_write_filter を呼び出します。

ngx_http_write_filter は本文フィルターの最後のものであるため、Nginx の最初の本文情報は、一連の本文フィルターを通過した後、最終的に ngx_http_write_filter を呼び出して出力します (説明する図があります)。

ここで注意すべき点は、Nginx はリクエスト ヘッダー全体をバッファーに入れるということです。このバッファーのサイズは、構成項目 client_header_buffer_size によって設定されます。ユーザーのリクエスト ヘッダーが大きすぎて、このバッファーに収まらない場合は、 , その後、Nginx はリクエスト ヘッダーを保持するために新しいより大きなバッファーを再割り当てします。この大きなバッファーは、large_client_header_buffers を通じて設定できます。48k の構成などのバッファーのlarge_buffer グループは、4 つの 8k バッファーが使用可能であることを意味します。

リクエスト ラインまたはリクエスト ヘッダーの整合性を維持するには、完全なリクエスト ラインまたはリクエスト ヘッダーを連続メモリに配置する必要があることに注意してください。したがって、完全なリクエスト ラインまたはリクエスト ヘッダーは保存されるだけです。バッファ内。

このように、リクエスト行がバッファサイズより大きい場合は414エラーが返され、リクエストヘッダのサイズがバッファサイズより大きい場合は400エラーが返されます。これらのパラメーターの値と Nginx の実際の実践を理解した後、アプリケーション シナリオでは、プログラムを最適化するために実際のニーズに応じてこれらのパラメーターを調整する必要があります。

処理フローチャート:

nginx リクエストを処理するにはどうすればよいですか?

上記は、Nginx における http リクエストのライフ サイクルです。

以上がnginx リクエストを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
nginxを開始する方法nginxを開始する方法Apr 14, 2025 pm 01:06 PM

質問:nginxを開始する方法は?回答:nginxスタートアップnginx検証nginxはnginxを開始しました他のスタートアップオプションを自動的に開始

Nginxが開始されるかどうかを確認する方法Nginxが開始されるかどうかを確認する方法Apr 14, 2025 pm 01:03 PM

nginxが開始されるかどうかを確認する方法:1。コマンドラインを使用します:SystemCTLステータスnginx(Linux/unix)、netstat -ano | FindStr 80(Windows); 2。ポート80が開いているかどうかを確認します。 3.システムログのnginx起動メッセージを確認します。 4. Nagios、Zabbix、Icingaなどのサードパーティツールを使用します。

nginxを閉じる方法nginxを閉じる方法Apr 14, 2025 pm 01:00 PM

NGINXサービスをシャットダウンするには、次の手順に従ってください。インストールタイプを決定します:Red Hat/Centos(SystemCtl Status Nginx)またはDebian/Ubuntu(Service Nginx Status)サービスを停止します:Red Hat/Centos(SystemCtl Stop Nginx)またはDebian/Ubuntu(Service Nginx Stop)無効自動起動(オプション):Debuntos/Centos/Centos/Centos/Centos/Centos (syst

Windowsでnginxを構成する方法Windowsでnginxを構成する方法Apr 14, 2025 pm 12:57 PM

Windowsでnginxを構成する方法は? nginxをインストールし、仮想ホスト構成を作成します。メイン構成ファイルを変更し、仮想ホスト構成を含めます。 nginxを起動またはリロードします。構成をテストし、Webサイトを表示します。 SSLを選択的に有効にし、SSL証明書を構成します。ファイアウォールを選択的に設定して、ポート80および443のトラフィックを許可します。

nginx403エラーを解く方法nginx403エラーを解く方法Apr 14, 2025 pm 12:54 PM

サーバーには、要求されたリソースにアクセスする許可がなく、NGINX 403エラーが発生します。ソリューションには以下が含まれます。ファイル許可を確認します。 .htaccess構成を確認してください。 nginx構成を確認してください。 SELINUXアクセス許可を構成します。ファイアウォールルールを確認してください。ブラウザの問題、サーバーの障害、その他の可能なエラーなど、他の原因をトラブルシューティングします。

Linuxでnginxを開始する方法Linuxでnginxを開始する方法Apr 14, 2025 pm 12:51 PM

Linuxでnginxを開始する手順:nginxがインストールされているかどうかを確認します。 systemctlを使用して、nginxを開始してnginxサービスを開始します。 SystemCTLを使用して、NGINXがシステムスタートアップでNGINXの自動起動を有効にすることができます。 SystemCTLステータスNGINXを使用して、スタートアップが成功していることを確認します。 Webブラウザのhttp:// localhostにアクセスして、デフォルトのウェルカムページを表示します。

Nginxが起動されているかどうかを確認する方法は?Nginxが起動されているかどうかを確認する方法は?Apr 14, 2025 pm 12:48 PM

Linuxでは、次のコマンドを使用して、nginxが起動されるかどうかを確認します。SystemCTLステータスNGINXコマンド出力に基づいて、「アクティブ:アクティブ(実行)」が表示された場合、NGINXが開始されます。 「アクティブ:非アクティブ(dead)」が表示されると、nginxが停止します。

nginx304エラーを解く方法nginx304エラーを解く方法Apr 14, 2025 pm 12:45 PM

質問への回答:304変更されていないエラーは、ブラウザがクライアントリクエストの最新リソースバージョンをキャッシュしたことを示しています。解決策:1。ブラウザのキャッシュをクリアします。 2.ブラウザキャッシュを無効にします。 3.クライアントキャッシュを許可するようにnginxを構成します。 4.ファイル許可を確認します。 5.ファイルハッシュを確認します。 6. CDNまたは逆プロキシキャッシュを無効にします。 7。nginxを再起動します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール