目录
前言
前面梗概介绍了Nginx模块配置的信息。简单地说,nginx的灵活性主要归功于他的高度模块化和可配置性。其中可配置性依赖于配置文件。在nginx中,模块就是一个struct类型的全局变量。Nginx通过为每个模块维护一个配置结构体来使得每个模块的行为根据配置文件而改变。
Nginx所有模块的配置结构体都有组织地放在nginx_cycle的conf_ctx中。conf_ctx维护的是一个多维数据,逻辑上可以简单地归结为下图的形式:
其中level1数组中的每个元素存储的是指向 核心模块的配置结构体的指针。核心模块的作用是 管理相同类型的功能模块。
这篇博文主要是讲一下event模块的解析配置过程。后面会依次介绍http,stream等功能模块的配置组织过程。其实都大同小异。
核心模块
event的核心模块是:
//nginx_event.c
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
};
注意,核心模块的的type=NGX_CORE_MODULE。
对于核心模块的来说,它的配置流程主要是包括以下几步:
1. 如果核心模块的ctx,也就是ngx_core_module_t的create_conf函数指针不为空,则调用这个函数,创建该核心模块的配置结构体。
2. 调用ngx_conf_parse和ngx_conf_param函数解析核心模块组织下的所有相同类型的功能模块。核心模块的结构体配置主要是在这部分完成。
3. 如果核心模块的ctx,也就是ngx_core_module_t的init_conf函数指针不为空,则调用这个函数。
以上这些步骤都是可以从ngx_init_cycle函数中清晰看到的。
显然这里的核心就是第二部分了。
对于event模块来说,所有event模块的感兴趣配置项都在配置文件的event{}区块中,如下所示:
events{
......
}
而”events”配置项的感兴趣模块是核心模块
ngx_events_module
我们从它的command成员可以看到:
static ngx_command_t ngx_events_commands[] = {
{ ngx_string("events"),
NGX_MAIN_CONF|NGX