ホームページ  >  記事  >  運用・保守  >  Nginxを使用してリクエストを処理する方法

Nginxを使用してリクエストを処理する方法

(*-*)浩
(*-*)浩オリジナル
2019-11-27 15:22:412421ブラウズ

Nginxを使用してリクエストを処理する方法

#Nginx はマルチプロセス モデルを使用して、マスター プロセスや複数のワーカー プロセスなどの外部サービスを提供します。マスター プロセスは、Nginx 自体と他のワーカー プロセスの管理を担当します。

実際のビジネス処理ロジックはすべてワーカー プロセス内にあります。ワーカープロセスには、クライアントから受信したリクエストを処理し続け、Nginxサービス全体が停止するまで無限ループを実行する機能があります。 (推奨学習: nginx use)

ワーカープロセスでは、ngx_worker_process_cycle()関数がこの無限ループの処理関数となります。

この関数におけるリクエストの簡単な処理フローは次のとおりです。

オペレーティング システムによって提供されるメカニズム (epoll、kqueue など)関連するイベントを生成します。

これらのイベントを受信して​​処理します。データを受信すると、上位レベルのリクエスト オブジェクトが生成されます。

リクエストのヘッダーと本文を処理します。

応答を生成し、クライアントに送り返します。

リクエストの処理を完了します。

タイマーやその他のイベントを再初期化します。

リクエスト処理プロセス

Nginx のリクエスト処理プロセスをより深く理解していただくために、HTTP リクエストを例として詳しく説明します。

Nginx 内からの HTTP リクエストの処理には、次の段階が含まれます。

HTTP リクエストを初期化します (クライアントからデータを読み取り、リクエストのすべての情報を含む HTTP リクエスト オブジェクトを生成します)。

リクエストヘッダーを処理します。

リクエスト本文を処理します。

このリクエスト (URL または場所) に関連付けられたハンドラーがあれば、それを呼び出します。

各フェーズ ハンドラーを順番に呼び出して処理します。

ここでは、フェーズ ハンドラーの概念を理解する必要があります。フェーズとは文字通り段階を意味します。したがって、フェーズ ハンドラーは理解しやすく、複数の処理ステージを含むハンドラーです。

各ステージには複数のハンドラーがあり、処理が特定のステージに達すると、そのステージのハンドラーが順番に呼び出され、HTTP リクエストが処理されます。

通常、フェーズ ハンドラーはこのリクエストを処理し、何らかの出力を生成します。通常、フェーズ ハンドラーは、構成ファイルで定義された場所に関連付けられます。

フェーズ ハンドラーは通常、次のタスクを実行します:

場所の構成を取得します。

適切な応答を生成します。

応答ヘッダーを送信します。

応答本文を送信します。

Nginx が HTTP リクエストのヘッダーを読み取るとき、Nginx はまずリクエストに関連付けられた仮想ホストの構成を検索します。この仮想ホストの構成が見つかった場合、通常、この HTTP リクエストは次の処理ステージ (フェーズ ハンドラー) を通過します:

NGX_HTTP_POST_READ_PHASE: リクエスト コンテンツの読み取りフェーズ

NGX_HTTP_SERVER_REWRITE_PHASE: サーバー要求アドレス書き換えフェーズ

NGX_HTTP_FIND_CONFIG_PHASE: 構成検索フェーズ:

NGX_HTTP_REWRITE_PHASE: ロケーション要求アドレス書き換えフェーズ

NGX_HTTP_POST_REWRITE_PHASE: アドレス書き換え送信要求フェーズ

NGX_HTTP_PREACESS_PHASE: アクセス権限チェック準備フェーズ

NGX_HTTP_ACCESS_PHASE: アクセス権限チェックフェーズ

NGX_HTTP_POST_ACCESS_PHASE: アクセス権限チェック送信フェーズ

NGX_HTTP_TRY_FILES_PHASE: 設定項目 try_files 処理フェーズ

NGX_HTTP_CONTENT_PHASE: コンテンツ生成フェーズ

NGX_HTTP_LOG_PHASE: ログ モジュール処理フェーズ

コンテンツ生成フェーズでは、リクエストに対する正しい応答を生成するために、Nginx は適切なコンテンツに任せる必要があります。処理するハンドラー。

このリクエストに対応する場所が構成ファイルでコンテンツ ハンドラーとして明示的に指定されている場合、Nginx は場所を照合することで対応するハンドラーを直接見つけ、リクエストをコンテンツ ハンドラーに渡すことができます。このような構成ディレクティブには、perl、flv、proxy_pass、mp4 などが含まれます。

リクエストに対応する場所に設定されたコンテンツ ハンドラーが直接ない場合、Nginx は順番に試行します。

場所にrandom_indexが設定されている場合、クライアントに送信されるファイルをランダムに選択します。

インデックス ディレクティブが場所に設定されている場合、インデックス ディレクティブで指定されたファイルがクライアントに送信されます。

autoindex on が場所で設定されている場合、リクエスト アドレスに対応するサーバー パス下のファイル リストがクライアントに送信されます。

このリクエストに対応する場所で gzip_static on が設定されている場合は、対応する .gz ファイルが存在するかどうかを確認し、存在する場合はこれをクライアントに送信します (クライアントが gzip をサポートしている場合)。

要求された URI が静的ファイルに対応する場合、静的モジュールは静的ファイルのコンテンツをクライアントに送信します。

コンテンツ生成フェーズが完了すると、生成された出力は処理のためにフィルター モジュールに渡されます。

フィルター モジュールは位置にも関係します。すべてのフィッター モジュールはチェーンに編成されます。出力は、フィルター モジュールからの戻り値が処理の完了を示すまで、すべてのフィルターを順番に通過します。

ここでは、次のような一般的なフィルター モジュールをいくつか示します。

サーバー側インクルード。

XSLT フィルタリング。

画像のスケーリングなど。

gzip 圧縮。

すべてのフィルターの中には、注意が必要なフィルター モジュールがいくつかあります。命令は呼び出し順に次のとおりです。

write: 出力をクライアントに書き込み、実際には接続に対応するソケットに書き込みます。

postpone: このフィルターはサブリクエスト、つまりサブリクエストを担当します。

copy: コピーする必要があるいくつかの buf (ファイルまたはメモリ) をコピーし、処理のために残りの本体フィルターに渡します。

以上がNginxを使用してリクエストを処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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