検索
ホームページ運用・保守Nginxnginxイベントモジュール構造の詳しい説明

イベント モジュール は、nginx のコア モジュールの 1 つであり、nginx でのクライアント リクエストの処理とコマンド ライン命令の実行は、イベント モジュールによって駆動されます。したがって、イベントモジュールの実装原理をマスターすることは、nginx の全体的なアーキテクチャを理解する上で非常に重要です。

nginxイベントモジュール構造の詳しい説明

この記事では、まずイベント モジュールとその実行プロセスに関連するいくつかのモジュール定義とそのソース コードについて説明します。 . 後の記事で行います。

推奨チュートリアル:

Nginx チュートリアル

nginx には主に、

ngx_events_modulengx_event_core_module という 2 つのイベント コア モジュールがあります。これら 2 つのモジュールの主な違いは、ngx_events_module のタイプが NGX_CORE_MODULE であることです。これは本質的にコア モジュール タイプですが、イベント モジュールの駆動ポイントです。その解析された構成アイテムはイベント {} です。イベント モジュールの関連構成を保存するための構造体が作成されます。

ngx_event_core_module のタイプは

NGX_EVENT_MODULE です。イベント モジュールの基本構成オブジェクトは構成オブジェクトに保存されますこのモジュールの主な機能は、events{} 設定ブロック内のサブ設定項目を解析することです。

これら 2 つのモジュールの基本構成を見てみましょう。

1. ngx_events_module

以下は、ngx_events_module モジュールの基本構成です:

ngx_module_t ngx_events_module = {
    NGX_MODULE_V1,
    &ngx_events_module_ctx,                /* module context */
    ngx_events_commands,                   /* module directives */
    NGX_CORE_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
static ngx_core_module_t ngx_events_module_ctx = {
    ngx_string("events"),
    NULL,
    ngx_event_init_conf
};
static ngx_command_t ngx_events_commands[] = {
    {ngx_string("events"),
     NGX_MAIN_CONF | NGX_CONF_BLOCK | NGX_CONF_NOARGS,
     ngx_events_block,
     0,
     0,
     NULL},
    ngx_null_command
};

ngx_events_module## の定義内# module, its モジュール コンテキストは ngx_events_module_ctx (2 番目の構造の構成) を指し、モジュール ディレクティブは ngx_events_commands (3 番目の構造の定義) を指します。 ngx_events_commands にはイベント設定項目が 1 つだけ定義されていることがわかり、この設定項目のタイプは NGX_CONF_BLOCK であり、これは設定ブロック タイプであることを意味します。は、nginx.conf で使用する events {} 構成ブロックであり、この構成ブロックの解析は ngx_events_block() メソッドを通じて実行されます。 nginx コア構成オブジェクト ngx_cycle_t の conf_ctx 配列では、各モジュールが配列の対応する位置に構成オブジェクトを持つことがわかります。同様に、ここのコア モジュールにも構成オブジェクトがあります。上記の 2 番目の構造体

ngx_events_module_ctx

の 2 番目の属性値は NULL です。これは、ここのイベント モジュールの定義に構成オブジェクトを作成するメソッドはありませんが、構成オブジェクトを初期化する方法はあることを意味します。 .メソッド、つまり 3 番目の属性値 ngx_event_init_conf() メソッドです。

では、ここで作成されたイベント モジュールの構成オブジェクトはどこにあるのでしょうか?

実際には、これは構成オブジェクトを解析するときに実行されます。つまり、

events {}

構成ブロックを解析する ngx_events_block() メソッドで実行されます。 。 の。このメソッドは基本的にポインターの配列を作成し、それを nginx コアと値オブジェクトの ngx_cycle_t の conf_ctx の対応する場所に割り当てるだけです。

2. ngx_event_core_module

ngx_event_core_module

モジュールを紹介する前に、まずイベント モジュールのインターフェイス定義について説明する必要があります: <pre class='brush:php;toolbar:false;'>typedef struct { // 事件模块的名称 ngx_str_t *name; // 在解析配置项前,这个回调方法用于创建存储配置项参数的结构体 void *(*create_conf)(ngx_cycle_t *cycle); // 在解析配置项完成后,init_conf()方法会被调用,用以综合处理当前事件模块感兴趣的全部配置项 char *(*init_conf)(ngx_cycle_t *cycle, void *conf); // 对于事件驱动机制,每个事件模块需要实现的10个抽象方法 ngx_event_actions_t actions; } ngx_event_module_t; typedef struct { // 添加事件方法,它负责把一个感兴趣的事件添加到操作系统提供的事件驱动机制(epoll、kqueue等)中, // 这样,在事件发生后,将可以在调用下面的process_events时获取这个事件 ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 删除事件方法,它把一个已经存在于事件驱动机制中的事件移除,这样以后即使这个事件发生, // 调用process_events()方法时也无法再获取这个事件 ngx_int_t (*del)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 启用一个事件,目前事件框架不会调用这个方法,大部分事件驱动模块对于该方法的实现都是 // 与上面的add()方法完全一致的 ngx_int_t (*enable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 禁用一个事件,目前事件框架不会调用这个方法,大部分事件驱动模块对于该方法的实现都是 // 与上面的del()方法完全一致的 ngx_int_t (*disable)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); // 向事件驱动机制中添加一个新的连接,这意味着连接上的读写事件都添加到事件驱动机制中了 ngx_int_t (*add_conn)(ngx_connection_t *c); // 从事件驱动机制中移除一个连接的读写事件 ngx_int_t (*del_conn)(ngx_connection_t *c, ngx_uint_t flags); ngx_int_t (*notify)(ngx_event_handler_pt handler); // 在正常的工作循环中,将通过调用process_events()方法来处理事件。 // 这个方法仅在ngx_process_events_and_timers()方法中调用,它是处理、分发事件的核心 ngx_int_t (*process_events)(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags); // 初始化事件驱动模块的方法 ngx_int_t (*init)(ngx_cycle_t *cycle, ngx_msec_t timer); // 退出事件驱动模块前调用的方法 void (*done)(ngx_cycle_t *cycle); } ngx_event_actions_t;</pre> nginx のイベント モジュールには、主に

ngx_event_module_t

ngx_event_actions_t という 2 つの構成構造があります。上記の定義からわかるように、ngx_event_module_t 構造は ngx_event_actions_t を参照します。

ngx_event_module_t

は主に現在のモジュールに必要な構成構造の作成と初期化に使用され、ngx_event_actions_t は主に現在のイベント モジュールが各イベントを処理する方法を定義します。このインターフェイスは典型的な実装イ​​ンターフェイスです。これらは、epoll の ngx_epoll_module_ctx.actions や kqueue の ngx_kqueue_module_ctx.actions など、nginx によって定義されたさまざまなイベント モデルです。ここから、イベント モジュールの定義が各イベント処理モデルの関連する処理メソッドを抽象化していることがわかります。 イベント モジュールには、イベントに関連する基本構成を保存するために使用されるモジュール、つまり

ngx_event_core_module

があります。ngx_event_module_t インターフェイスが実装されていますが、その具体的な機能はありませんイベント処理が行われます。以下は ngx_event_core_module モジュールの定義です: <pre class='brush:php;toolbar:false;'>ngx_module_t ngx_event_core_module = { NGX_MODULE_V1, &amp;ngx_event_core_module_ctx, /* module context */ ngx_event_core_commands, /* module directives */ NGX_EVENT_MODULE, /* module type */ NULL, /* init master */ // 该方法主要是在master进程启动的过程中调用的,用于初始化时间模块 ngx_event_module_init, /* init module */ // 该方法是在各个worker进程启动之后调用的 ngx_event_process_init, /* init process */ NULL, /* init thread */ NULL, /* exit thread */ NULL, /* exit process */ NULL, /* exit master */ NGX_MODULE_V1_PADDING }; static ngx_event_module_t ngx_event_core_module_ctx = { &amp;event_core_name, ngx_event_core_create_conf, /* create configuration */ ngx_event_core_init_conf, /* init configuration */ // ngx_event_core_module_ctx并不直接负责TCP网络事件的驱动, // 因而这里的ngx_event_actions_t中的方法都为NULL {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL} }; static ngx_command_t ngx_event_core_commands[] = { // 连接池的大小,也即每个worker进程中支持的TCP最大连接数,它与connections配置项的意义是重复的 {ngx_string(&quot;worker_connections&quot;), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_connections, 0, 0, NULL}, // 确定选择哪一个事件模块作为事件驱动机制 {ngx_string(&quot;use&quot;), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_use, 0, 0, NULL}, // 对应于ngx_event_s中的available属性,对于epoll事件驱动模式来说,意味着在接收到一个新连接事件时, // 调用accept以尽可能多地接收连接 {ngx_string(&quot;multi_accept&quot;), NGX_EVENT_CONF | NGX_CONF_FLAG, ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t, multi_accept), NULL}, // 确定是否使用accept_mutex负载均衡锁,默认为开启 {ngx_string(&quot;accept_mutex&quot;), NGX_EVENT_CONF | NGX_CONF_FLAG, ngx_conf_set_flag_slot, 0, offsetof(ngx_event_conf_t, accept_mutex), NULL}, // 启用accept_mutex负载均衡锁后,延迟accept_mutex_delay毫秒后再试图处理新连接事件 {ngx_string(&quot;accept_mutex_delay&quot;), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_conf_set_msec_slot, 0, offsetof(ngx_event_conf_t, accept_mutex_delay), NULL}, // 需要对来自指定IP的TCP连接打印debug级别的调试日志 {ngx_string(&quot;debug_connection&quot;), NGX_EVENT_CONF | NGX_CONF_TAKE1, ngx_event_debug_connection, 0, 0, NULL}, ngx_null_command };</pre><p>在事件模块的定义中,module context指向的是一个<code>ngx_event_module_t结构体,这里的ngx_event_core_module的module context指向的就是第二个结构体定义的ngx_event_core_module_ctx,而ngx_event_core_module_ctx中则定义了当前核心模块创建配置对象和初始化配置对象的方法,可以看到,其actions属性中的值全部为NULL,这是因为该模块并不负责处理具体的事件处理方案,而是负责核心结构体的创建和初始化,nginx也会保证这个模块在所有的事件模块中最先被调用,其余各个事件模块也可以引用该模块所存储的基础配置数据。

ngx_event_core_module中第三个属性ngx_event_core_commands指向的是上面的第三个结构体,这个结构体中定义了当前事件模块所能使用的各个配置项的基本配置以及解析这些配置项的方法。

这里我们需要着重强调ngx_event_core_module中的第六个和第七个属性,这两个属性指向的是都是某个方法,第六个属性init module的主要是在nginx启动过程中解析完nginx.conf配置文件之后执行,其作用是对当前模块进行初始化的工作,而第七个属性init process主要是在nginx启动worker进程之后worker进程开始执行主循环之前调用的,其作用是进行worker进程执行前的初始化工作。

3. 模块方法的执行流程

通过上面的介绍我们大致了解了定义事件模块的两个核心模块的主要方法及其作用,这里则主要是对这些方法的执行流程进行讲解,如下是其流程示意图:

nginxイベントモジュール構造の詳しい説明

 对于上面的,这里需要对其各个步骤的功能进行说明:

1.解析nginx.conf文件,当遇到events配置项时,就使用ngx_evetns_block()方法对其进行解析;

2.创建用于存储各个事件模块存储配置项的结构体的数组;

3.采用递归的方式解析events配置块中的子配置项;

4.依次检查事件核心模块的配置项,如果其没有赋值,则对其赋一个默认值;

5.检查是否创建了存储事件模块配置项的数组,该检查的主要目的是判断核心模块是否成功初始化了;

6.主要是通过解析得到的配置项,设置诸如时间定时器的执行频率、可打开的文件句柄限制和初始化记录统计数据的属性;

7.在worker进程中调用,用于初始化worker进程运行所需要的环境,比如初始化事件队列、初始化事件模型、添加时间更新的定时任务等;

以上がnginxイベントモジュール構造の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はoschinaで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
レイジュンは彼の新年の願いを共有しています:ジムで300,000台の車と100のチェックイン時間を配達しますレイジュンは彼の新年の願いを共有しています:ジムで300,000台の車と100のチェックイン時間を配達しますApr 13, 2025 pm 11:54 PM

新年の初めに、レイ・ジュンは新年の初めに2025年の3つの新年の願いを共有し、この4時間半のライブ放送は多くの注目を集めました。 Lei Junの3つの主要な願いは次のとおりです。最初に、300,000台の車両の配達目標を達成し、プレッシャーを軽減し、もはや進歩に巻き込まれません。第二に、旅行時間を増やし、世界中の美しい景色を楽しんだり、特別な食べ物を味わったり、仕事と組み合わせて車のテストを行います。第三に、フィットネスに固執し、体を強化するためにジムで100回チェックインする予定です。レイ・ジュンは、ライブ放送で、2024年にコンパクトなスケジュールで旅行したことを認めたので、彼はしばしば短時間しか滞在しなかったため、地元の文化を深く体験するのが難しくなりました。たとえば、ドイツの新しいノーススピードウェイでは、わずか8時間滞在しました。したがって、新年には、彼は仕事と生活と旅行のバランスを改善できることを望んでいます

年次評判の傑作! No.9 CompanyのMicro-Film「Memory Travel」は多くの権威ある賞を受賞しました年次評判の傑作! No.9 CompanyのMicro-Film「Memory Travel」は多くの権威ある賞を受賞しましたApr 13, 2025 pm 11:51 PM

No. 9とブランドのスポークスマンYi Yang Qianxiによって作成されたマイクロフィルム「メモリトラベル」は、2024年にいくつかの権威あるメディア賞を受賞し、今年の傑作になりました。この作品は、そのユニークな物語スタイル、絶妙な生産、誠実な感情で業界から高い評価を得ています。 2024年の賞と栄誉:2024ゴールドタッチグローバルビジネスイノベーション賞 - 毎年恒例の映画とテレビ広告2024中国広告マーケティング賞 - エンターテインメントマーケティンググループシルバーアワード2024トップデジタルイノベーションマーケティング賞 - 映画およびテレビプロダクションゴールドアワード2024上海国際広告フェスティバル - マイクロフィルムシルバーアワード2024第11日イノベーションアワード賞賞を受賞します。

イノベーションをリードし、別の名誉を獲得してください! AgonはPCONLINE2024 Zhizhen Technology Awardを受賞しましたイノベーションをリードし、別の名誉を獲得してください! AgonはPCONLINE2024 Zhizhen Technology Awardを受賞しましたApr 13, 2025 pm 11:48 PM

最近、PCONLine2024 Zhizhen Technology Awardが正式に発表され、Agon Aidong QD-Oled E-Sports Display Ag326udは「Technical Innovation of the Year」賞を受賞しました。この名誉は、業界の技術的利点と市場パフォーマンスの高い認識を表しているだけでなく、e-Sportsディスプレイテクノロジーの分野でのAgonの革新的な能力と顕著な成果を完全に反映しています。 01.テクノロジーの将来を見ると、Pconline Zhizhen Technology Awardの権威ある価値は、テクノロジー業界の天気の良いものです。 Pconline Zhizhen Technology Awardは、厳密な評価システムと詳細な業界分析により、業界の幅広い認識を首尾よく獲得しています。この賞は、テクノロジー業界の開発を促進する優れた製品やブランドを称賛することに常に取り組んできました。

ソニーは、PS5 Proで特別なGPUを使用してAMDを使用してAIを開発する可能性を確認していますソニーは、PS5 Proで特別なGPUを使用してAMDを使用してAIを開発する可能性を確認していますApr 13, 2025 pm 11:45 PM

Sony InteractiveEntertainmentのチーフアーキテクト(SIE、Sony Interactive Entertainment)のMark Cernyは、パフォーマンスアップグレードAMDRDNA2.xアーキテクチャGPU、およびAMDとの機械学習/人工知能プログラムコードノームの「Amethylst」を含む、次世代ホストPlayStation5Pro(PS5PRO)のハードウェアの詳細をリリースしました。 PS5PROパフォーマンスの改善の焦点は、より強力なGPU、高度なレイトレース、AI搭載のPSSRスーパー解像度関数を含む3つの柱に依然としてあります。 GPUは、SonyがRDNA2.xと名付けたカスタマイズされたAMDRDNA2アーキテクチャを採用しており、RDNA3アーキテクチャがあります。

最後に変わった! Microsoft Windows検索機能は新しいアップデートの先導最後に変わった! Microsoft Windows検索機能は新しいアップデートの先導Apr 13, 2025 pm 11:42 PM

MicrosoftのWindows検索機能に対する改善は、EUのWindows Insiderチャネルでテストされています。以前は、統合されたWindows検索機能はユーザーによって批判されており、経験が不十分でした。この更新は、検索機能を2つの部分に分割します。ローカル検索とBingベースのWeb検索でユーザーエクスペリエンスを向上させます。検索インターフェイスの新しいバージョンは、デフォルトでローカルファイル検索を実行します。オンラインで検索する必要がある場合は、[Microsoft BingWebsearch]タブをクリックして切り替える必要があります。切り替え後、検索バーには「Microsoft BingWebsearch:」が表示され、ユーザーはキーワードを入力できます。この動きにより、ローカル検索結果とBing検索結果の混合が効果的に回避されます

巧みにグリル!モンスターハンターは、20周年記念バーベキュータイマーとケトルを発売します巧みにグリル!モンスターハンターは、20周年記念バーベキュータイマーとケトルを発売しますApr 13, 2025 pm 11:39 PM

カプコンの「モンスターハンター」シリーズの20周年を祝うために、バウダオクラブはユニークな雑誌セットである「モンスターハンター」をテーマにしたバーベキュータイマーと付属カップを立ち上げました。このセットは、12月27日に日本の自宅のコンビニエンスストアで利用可能になり、3,498円で価格設定されます。この雑誌セットの最大のハイライトは、インタラクティブなバーベキュータイマーで、一連のゲームの古典的なバーベキューシーンを完全に複製します。タイマーは、LED Flame Light EffectsとGame BGMを備えた古いバージョンのバーベキューツールを使用して設計されており、実際のバーベキュープロセス中に狩猟の楽しみを体験できます。回転ハンドルは、反転したバーベキューをシミュレートします。ベーキングに成功した後、「ベイクド!」の音声プロンプトはプレイされます。タイマーサイズは約9.5cm(高さ)x 10.7cm(幅)x 8cm(深い)、内蔵l

私はユーザーをとても理解しています! Xiaomi SU7の所有者は無料で手に入れることができますバルブコアキャップ私はユーザーをとても理解しています! Xiaomi SU7の所有者は無料で手に入れることができますバルブコアキャップApr 13, 2025 pm 11:36 PM

Xiaomi Autoの最初の記念日のお祝いは、車の所有者に新年の贈り物を与えます!昨年、配達量が130,000台を超えた後、Xiaomi Autoの公式Weiboは、Lei Junの古典的な引用「Areyouok?」を提供すると発表しました。すべてのXiaomi SU7の所有者および将来の所有者に。番号は限られており、無料で受け取ることができます!アクティビティ時間:2024年12月28日の午後4時から2025年1月20日に23:59:59。2024年12月31日の23:59:59より前に車を購入するか、注文を完了したユーザーは、4ピースの「Areyouok?」を取得できます。バルブコアキャップは無料で。このバルブコアキャップは、今年9月に初めてリリースされ、明るい黄色のPVCと真鍮素材で作られています。真鍮のコアは直接埋め込まれており、安全な運転を確保し、落ちるのは簡単ではありません。広く使用されている、

HDMI 2.2規格は、2025年の前夜に発表される予定です! 8kの解像度はまもなく予定されていますHDMI 2.2規格は、2025年の前夜に発表される予定です! 8kの解像度はまもなく予定されていますApr 13, 2025 pm 11:33 PM

HDMI2.2規格は、2025 CES展示の前夜に公式にリリースされると予想されています。 HDMIFORUMは、この新世代のビデオ信号伝送プロトコル仕様を1月6日に発表する予定です。2017年にリリースされたHDMI2.1標準は、48Gbpsの最大帯域幅を持ち、4K144Hzおよび8k30Hzのビデオ伝送をサポートし、DSCテクノロジーで最大10k120Hzになります。 HDMI2.2は、帯域幅を大幅に増加させ、より高い解像度とリフレッシュレートをサポートし、新しいワイヤーを採用すると予想されます。特定の仕様はまだ開示されていませんが、HDMI2.2は必然的に48Gbpsの帯域幅と10240*4320のHDMI2.1の解像度制限を上回ります。 DisplayPort2.1が20にあることを考えると

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター