このセクションから、http モジュールの実装原理について説明します。http モジュールで非常に重要な点は、http ブロック、server ブロック、location ブロックにデータを格納する方法です。nginx の一部の設定項目は、複数の設定ブロックで使用できます。http ブロック、server ブロック、location ブロックの 2 つ以上の設定ブロックが設定項目で構成されているとき、nginx がこれらの設定項目をどのように処理するかという疑問が生じます。この記事では主に、http ブロック内の各モジュールのデータがどのように保存されるかについて説明します。これは、nginx の http モジュールがどのように動作するかを理解するための重要な基礎となります。 1. コアモジュールの保管方法 nginx の実行中は、属性 ここでマークされている http モジュールの下では、 typedef構造体{ //MAIN レベルの構成を保存します void **main_conf; //SRV レベルの構成を保存します void **srv_conf; //LOC レベルの構成を保存します void **loc_conf; } ngx_http_conf_ctx_t; nginx.conf 構成ファイルでは、http ブロックの下に server ブロックがあり、server ブロックの下に location ブロックがあることがわかります。さらに、location ブロックの下にサブ location ブロックがある場合もあります。ここでの ここでの各モジュールには、配列の対応するインデックス位置に格納される構造があるため、なぜここで 3 つの配列が必要になるのでしょうか。たとえば、 { ngx_string("variables_hash_max_size"), NGX_HTTP_MAIN_CONF | NGX_CONF_TAKE1、 ngx_conf_set_num_slot、 NGX_HTTP_MAIN_CONF_OFFSET、 オフセット(ngx_http_core_main_conf_t、variables_hash_max_size)、 NULL }, { ngx_string("聞く"), NGX_HTTP_SRV_CONF | NGX_CONF_1MORE、 ngx_http_core_listen、 NGX_HTTP_SRV_CONF_OFFSET、 0, NULL }, { ngx_string("ルート"), NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_HTTP_LIF_CONF | NGX_CONF_TAKE1、 ngx_http_core_root、 NGX_HTTP_LOC_CONF_OFFSET、 0, NULL }, ここでは、 // 設定オブジェクトを検索します。 NGX_DIRECT_CONF 定数は、設定ストレージ領域のアドレス指定方法を指定するためにのみ使用されます。これはコアモジュールでのみ使用されます if (cmd->type & NGX_DIRECT_CONF) { conf = ((void **) cf->ctx)[cf->cycle->modules[i]->index]; // NGX_MAIN_CONF 定数には 2 つの意味があります。1 つは、指定された命令のコンテキストが main であるということです (実際には、コア モジュールを参照しています)。 // 2 番目は、構成保存領域のアドレス指定方法を指定します。 } そうでない場合 (cmd->type & NGX_MAIN_CONF) { conf = &(((void **) cf->ctx)[cf->cycle->modules[i]->index]); // コア モジュールを除き、他のタイプのモジュールは 3 番目の構成アドレス指定方法を使用します。つまり、cmd->conf の値に応じて、cf->ctx から対応する構成を取得します。 httpモジュールを例にとると、cf->confのオプション値はNGX_HTTP_MAIN_CONF_OFFSET、 // NGX_HTTP_SRV_CONF_OFFSET、NGX_HTTP_LOC_CONF_OFFSET、 // それぞれ 3 つの http 構成レベル「http{}」、「server{}」、「location{}」に対応します。 // この if 判断の主な機能は、cf->ctx の型が ngx_http_conf_ctx_t であり、cmd->conf の主な値がオプションであるかどうかです // NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET、NGX_HTTP_LOC_CONF_OFFSET、 // ngx_http_conf_ctx_t の属性は main_conf、srv_conf、loc_conf であることがわかります。 // 実際、ここでは現在の構成オブジェクトが 3 つの配列のどれに格納されているかを計算します。default_type 命令を例に挙げます。 // ngx_command_t の設定は次のとおりです。 // {ngx_string("default_type"), // NGX_HTTP_MAIN_CONF | NGX_HTTP_SRV_CONF | NGX_HTTP_LOC_CONF | NGX_CONF_TAKE1、 // ngx_conf_set_str_slot、 // NGX_HTTP_LOC_CONF_OFFSET、 // offsetof(ngx_http_core_loc_conf_t、default_type)、 // NULL}, // ご覧のとおり、conf 属性の値は NGX_HTTP_LOC_CONF_OFFSET であり、loc_conf 配列に格納されていることを意味します。 // 配列の要素型はngx_http_core_loc_conf_tなので、次のngx_command_tが // オフセット属性の値は offsetof(ngx_http_core_loc_conf_t, default_type) として指定されます。 // これは、ngx_http_core_loc_conf_t 構造で default_type 属性が計算される方法です。 // 次のif判断ステップconfp = *(void **) ((char *) cf->ctx + cmd->conf);により、現在使用されている構造体がmain_conf、srv_confにあるかどうかを計算できます。 // そしてその配列内のloc_conf、そして2番目のステップを通してconf = confp[cf->cycle->modules[i]->ctx_index]; // 計算により、配列内の構造体の特定の位置を計算し、構造体データを取得できます。 // この計算方法は、http モジュールの設定項目の取得にのみ適用可能であることに注意してください。http モジュールの設定構造のみが // ngx_http_conf_ctx_t 型であるためです。} else if (cf->ctx) { confp = *(void **) ((char *) cf->ctx + cmd->conf); if (confp) { conf = confp[cf->cycle->modules[i]->ctx_index]; } } ここでは、最後の 2. サーバーブロックの保管 上で述べたように、 この図は少し複雑に見えますが、複雑ではありません。構成ブロックの区分に従って、上の 3. ロケーションブロックの保存方法 ロケーション ブロックの保存の場合、その保存構造は依然として さらに、サーバー ブロックの下には複数のロケーション ブロックがあります。ストレージ構造の観点から見ると、これらのロケーション ブロックはキューの形式で編成されています。サーバー ブロックと同様に、このキューは、配置されているサーバー ブロックに対応する この図は、2 つのロケーションが並列に編成されている状況を示しています。main_conf と 4. まとめ この記事では、まず 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: H5 WeChatパブリックアカウント認証を実装するための簡単な手順
この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...
1. フォントを実行し、フォント フォルダーを開いて、使用するフォント ファイルを見つけます。 2....
この記事の例では、テーブル行データのスクロール効果を実現するためのjQueryの具体的なコードを参考...
目次1. MySQLイメージを取得する2. ダウンロードが完了したか確認する3. MySQLはローカ...
目次序文静的スコープと動的スコープ静的スコープ実行プロセス動的スコープ実行プロセスエクササイズ練習1...
1 QPS 計算 (1 秒あたりのクエリ数) MyISAMエンジンベースのDBの場合 MySQL&g...
目次ネットワーク構成を表示するネットワークインターフェース情報を表示する---ifconfigルーテ...
1. 親コンテナーをテーブルに設定し、子をインライン要素に設定します。テキストを表示するサブコンテン...
序文MySQL では、EXPLAIN コマンドを使用して、テーブルの接続方法や SELECT ステー...
この記事では、vueの大画面表示適応の具体的なコードを参考までに紹介します。具体的な内容は以下のとお...
序文多くの学生は既に再帰に精通していると思います。アルゴリズムの問題を解決するために再帰がよく使...
この記事では、:placeholder-shown 疑似クラスを使用して、純粋な CSS で浮動疑問...
目次文章1. 機械を準備する2. Dockerをインストールする1. 依存パッケージをインストールす...
目次1. 基本概念1.1 2種類のピクセル1.2 3つのビューポート2. ビューポート設定3. 1回...
この記事では、検証コード干渉を実装するためのjsの具体的なコードを参考までに共有します。具体的な内容...