nginx の http リクエスト処理の各段階の詳細な分析

nginx の http リクエスト処理の各段階の詳細な分析

nginx の HTTP モジュールを作成する場合、リクエスト開始時のアクセス許可の有無、コンテンツ生成時のフィルタリングなどの処理など、さまざまな目的を達成するために、各段階で HTTP リクエストを適切に処理する必要があります。コンパイルされた nginx モジュールに登録されている処理フェーズが正しくない場合、処理したいコンテンツが現時点では実際には利用できないなど、目的の結果が得られない可能性があります。

さまざまな処理要件を満たすために、nginx 内で複数のフェーズ タイプが定義されています (ngx_http_core_module.h では、バージョンによって定義が異なります)。

typedef列挙型{
 NGX_HTTP_POST_READ_PHASE = 0、
 
 NGX_HTTP_SERVER_REWRITE_PHASE、
 
 NGX_HTTP_FIND_CONFIG_PHASE、
 NGX_HTTP_REWRITE_PHASE、
 NGX_HTTP_POST_REWRITE_PHASE、
 
 NGX_HTTP_PREACCESS_PHASE、
 
 NGX_HTTP_ACCESS_PHASE、
 NGX_HTTP_POST_ACCESS_PHASE、
 
 NGX_HTTP_TRY_FILES_PHASE、
 NGX_HTTP_CONTENT_PHASE、
 
 NGX_HTTP_LOG_PHASE
} ngx_http_phases;

対応する意味は次のとおりです。

NGX_HTTP_POST_READ_PHASE = 0 // 読み取り要求フェーズ NGX_HTTP_SERVER_REWRITE_PHASE // URI 変換フェーズ NGX_HTTP_FIND_CONFIG_PHASE // フェーズを実行するための対応する構成を検索 NGX_HTTP_REWRITE_PHASE // URI 変換フェーズ (ここではあまり明確ではありません)
NGX_HTTP_POST_REWRITE_PHASE // 変換された URL 結果を処理するステージ NGX_HTTP_PREACCESS_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 のプロセス全体を分析できます。プロセスは最初から最後まで実行されます。最後に LOG が実行されていることがわかります。コンテンツ セグメントの処理は、通常、フィルター モジュールで行われます。NGX_HTTP_LOG_PHASE ステージに登録された処理セグメントは、返されたデータを取得できません。返されたデータは、クライアントに送信された後、直接解放されます。したがって、各段階を処理する際には、各段階のデータ準備状況を明確にする必要があります。

通常、独自の処理モジュールは次の方法で登録できます。

静的 ngx_int_t
ngx_http_xxx_init(ngx_conf_t *cf)
{
 ngx_http_handler_pt *h;
 ngx_http_core_main_conf_t *cmcf;
 
 cmcf = ngx_http_conf_get_module_main_conf(cf、ngx_http_core_module);
 
 h = ngx_array_push(&cmcf->phases[NGX_HTTP_CONTENT_PHASE].handlers);
 h == NULLの場合{
 NGX_ERROR を返します。
 }
 
 ngx_http_xxx_handler をハンドラに追加します。
 
 NGX_OK を返します。
}

ngx_http_xxx_up_handler の戻り値は次のようになります。

NGX_OK //処理が成功し、次のステージに進みますNGX_DECLINED //処理を中止しますNGX_AGAIN || NGX_DONE //処理が完了しました。この値を返すとリクエストがトリガーされますNGX_ERROR || NGX_HTTP_.. //処理エラーまたはHTTPのその他のステータス値

さらに、NGX_HTTP_CONTENT_PHASE フェーズには、次のように登録する別の方法があります。

静的文字 *
ngx_http_xxx_server(ngx_conf_t *cf、ngx_command_t *cmd、void *conf)
{
 ngx_str_t *値;
 ngx_url_t u;
 ngx_http_core_loc_conf_t *clcf;
 
 clcf = ngx_http_conf_get_module_loc_conf(cf、ngx_http_core_module);
 
 clcf->ハンドラ = ngx_http_xxx_handler;
 
 clcf->name.data[clcf->name.len - 1] == '/'の場合{
 clcf->auto_redirect = 1;
 }
 
 NGX_CONF_OK を返します。
}

しかし、この方法では、やらなければならないことが多すぎます。ほとんどの場合、上流の統合やリクエストの特別な処理を考慮する必要があります。たとえば、分散ストレージの分散では、要求されたデータを特別な SERVER に直接渡してコンテンツを取得するなど、リクエスト処理をファイルシステムに関連付ける必要があります。へへ。

nginx の http リクエスト処理の各段階の詳細分析に関するこの記事はこれで終了です。nginx の http リクエスト処理の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Nginx は https ウェブサイト構成コード例を実装します
  • https暗号化アクセス用にnginxを設定するための詳細なチュートリアル
  • Nginxドメイン名転送のhttpsアクセスの実装
  • Alibaba Cloud Nginx はドメイン名アクセス プロジェクトを実装するために https を設定します (グラフィック チュートリアル)
  • Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します
  • HttpとHttpsの両方をサポートするNginxの詳細な設定
  • nginx + セカンダリドメイン名 + https サポートを使用する
  • Nginxはhttpリクエスト実装プロセス分析を処理する

<<:  複数のフィールドを変更するためのMysql更新の構文の詳細な分析

>>:  マークアップ言語 - リスト再び

推薦する

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

VMware マルチノード環境を構成する方法

このチュートリアルでは CentOS 7 64 ビットを使用します。各仮想マシンに 2GB のメモリ...

JavaScript でフロントエンドのカウントダウン効果を実装する

この記事では、フロントエンドのカウントダウン効果を実現するためのJavaScriptの具体的なコード...

WebページでjQueryを参照する方法

CDN(コンテンツ配信ネットワーク)を通じて参照できます。 jQuery は Google と Mi...

Vueデータ変更検出の基本的な実装の簡単な分析

目次1. オブジェクトの変更検出2. オブジェクトに関する質問配列変更検出3.1 背景3.2 実装I...

Vue.js フロントエンド Web ページ ポップアップ非同期動作例の分析

目次1. 序文2. ポップアップコンポーネントを2つ見つける3. 自分で作る3.1. Promise...

主要ブラウザとそのカーネルの紹介

トライデント コア: IE、MaxThon、TT、The World、360、Sogou Brows...

CSS フロートプロパティ図 フロートプロパティの詳細

CSS の float プロパティを正しく使用することは、カバーすべき内容が多く、ブラウザの互換性の...

MySQLの始め方から諦め方まで徹底解説 - インストール

学ぶ内容1. ソフトウェアのインストールとサーバーの設定。 2. (オプションですが、強くお勧めしま...

MySQL の起動時に InnoDB エンジンが無効になる問題の解決方法

問題を見つける今日、仕事中に、ローカル データベースから仮想マシン CentOS 6.6 上のデータ...

MySQL インデックスの一般的な問題の概要

Q1: データベースにはどのようなインデックスがありますか?メリットとデメリットは何ですか? 1. ...

Javascript で関数のカリー化とデカリー化を実装する方法

関数のカリー化(黒い疑問符の顔)? ? ?カレー(黒い疑問符の顔)? ? ?これは完璧な中国語翻訳で...

Dockerでのpython3.8イメージのインストールについて

Docker Hub公式サイト1. Pythonミラーを検索するdocker 検索 python 2...

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...