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

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

推薦する

タイムライン効果を実現するCSS3

最近、コンピューターの電源を入れたところ、Geek Academy が新規ユーザーに 1 か月の無料...

CentOS7.4 起動時の緊急モードへようこそメッセージに対する解決策

今日は仮想マシンを使って実験をしました。システムをインストールし、いくつかのオプションを最適化した後...

DockerでSpring Bootアプリケーションを実行する方法

ここ数日、dockerでSpring Bootアプリケーションを実行する方法を勉強してきました。以前...

HTML外部参照CSSファイルが効果を発揮しない理由の分析と解決

フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...

Linux で nginx を起動および再起動する方法

Nginx (エンジン x) は、IMAP/POP3/SMTP サービスも提供する高性能 HTTP ...

MySQLで一意のサーバーIDを生成する方法

序文MySQL では、server-id を使用してデータベース インスタンスを一意に識別し、それを...

Dockerコンテナでの静的ウェブサイトレイアウトの実装

サーバーの配置数日間無料で使用できるクラウドサーバー(Alibaba Cloud、Huawei Cl...

Zabbix ベースの Jenkins プロセス監視の詳細な説明

1. 監視アーキテクチャ図 2. 実装のアイデアJenkins に Metrics プラグインをイン...

MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明

序文mysqlslap は、MySQL サーバーへのクライアント負荷をシミュレートし、各ステージの時...

MySQL テーブル内の重複データを検索して削除する方法の概要

時々、データベース テーブルに重複したデータが大量に保存されます。これらの重複データはリソースを浪費...

JavaScriptは入力ボックスコンポーネントを実装します

この記事では、入力ボックスコンポーネントを手動で実装するための具体的なコードを参考までに紹介します。...

ウェブフロントエンド開発者が知っておくべき 9 つの実用的な CSS プロパティ

1. 角を丸くする今日の Web デザインは、常に最新の開発テクノロジーに追随しており、HTML5 ...

Vueのプラグインの仕組みとインストールの詳細を深く理解する

序文: Vue を使用する場合、多くの場合、カスタム プラグインをいくつか使用して記述し、 Vue....

js ドラッグ アンド ドロップ テーブルでコンテンツ計算を実現する

この記事の例では、コンテンツの計算を実現するためのjsドラッグアンドドロップテーブルの具体的なコード...

Linux 上の MYSQL 5.7 でルート パスワードを取得する際の問題 (テスト済み、利用可能)

目次1. --skip-grant-tables 経由で取得する1.1 my.conf を変更し、新...