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更新の構文の詳細な分析

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

推薦する

Ubuntu 18.04 Linux システムに JDK と Mysql をインストールする方法

プラットフォームの展開1. JDKをインストールするステップ1. OracleJDKをダウンロードす...

Linux での tcpdump コマンド例の詳細な説明

序文簡単に言えば、tcpdump は、ネットワーク上のトラフィックをダンプし、ユーザーの定義に従って...

Webデザインチュートリアル(7):Webデザインの効率化

<br />前の記事:Webデザインチュートリアル(6):デザインへの情熱を持ち続けまし...

Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

目次環境設定の概要1.K8Sとは何ですか? 2. K8S を使用する理由3. K8S を使用する利点...

ブラウザの自動フォーム入力によるウェブページのスタイル損失の原因の分析と解決

バックエンドからフロントエンドまで、なんと悲劇なのでしょう。他の人の CSS を自分の jsp We...

MySQLでよく使われるSQLとコマンドの入力からデータベースの削除、そして終了まで

目次開始と停止データベース関連の操作データベーステーブル関連の操作制約関連デフォルトの制約高度なデー...

Faint: 「Web2.0 を使用して標準に準拠したページを作成する」

今日、ある人がウェブサイト開発プロジェクトについて話をしてくれました。具体的な要件について話すと、「...

img タグの src 属性値が空の場合の 2 つのリクエストの問題 (IE 以外のブラウザ)

img src 値が空の場合、リクエストが 2 つ行われます。一部の学生は以前に同様の状況に遭遇した...

JS ES 新機能テンプレート文字列

目次1. テンプレート文字列とは何ですか? 2. 複数行のテンプレート文字列2.1 式付きテンプレー...

Reactスロットの使い方

目次必要コアアイデアReactでスロットを実装する2つの方法必要コンポーネントを自分で書きました。コ...

vscode dockerプラグインのdocker.socket権限問題を解決する

解決策: システム内のすべての .vscode 関連プロセスを終了します (または、remote-s...

vue プロジェクトのデプロイと Nginx でのプロキシ設定の問題の分析

1. nginxをインストールして起動する # nginxをインストールする sudo apt-ge...

WIN10 システムと Docker 内部コンテナ IP 間の通信方法

1. Windows 版の Docker をインストールしたら、Docker クイックスタート ター...

mysql5.7でbinlogを使用してデータを復元する方法

ステップ1: MySQLでbinlogが有効になっていることを確認する '%log_bin%...

MySQLの大規模テーブル最適化ソリューションについての簡単な説明

背景Alibaba Cloud RDS for MySQL(MySQL バージョン 5.7)データベ...