ngx_event_get_conf的定义如下:
#define ngx_event_get_conf(conf_ctx, module) \
(*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];
struct ngx_cycle_s {
/* 保存着所有模块存储配置项的结构体指针,它首先是一个数组,每个数组成员又是一个指针,
这个指针指向另一个存储着指针的数组,因此会看到void ****
*/
void ****conf_ctx;
// 内存池
ngx_pool_t *pool;
/*
日志模块中提供了生成基本ngx_log_t日志对象的功能,这里的log实际上是在还没有执行ngx_init_cycle方法前,
也就是还没有解析配置前,如果有信息需要输出到日志,就会暂时使用log对象,它会输出到屏幕。
在ngx_init_cycle方法执行后,将会根据nginx.conf配置文件中的配置项,构造出正确的日志文件,此时会对log重新赋值。
*/
ngx_log_t *log;
/*
由nginx.conf配置文件读取到日志文件路径后,将开始初始化error_log日志文件,由于log对象还在用于输出日志到屏幕,
这时会用new_log对象暂时性地替代log日志,待初始化成功后,会用new_log的地址覆盖上面的log指针
*/
ngx_log_t new_log;
/*
对于poll,rtsig这样的时间模块,会以有效文件句柄数来预先建立这些ngx_connection_t结构体,
以加速事件的收集,分发。这时files就会保存所有ngx_connection_t的指针组成的数组,
files_n就是指针的总数,而文件句柄的值用来访问files数组成员
*/
ngx_connection_t **files;
// 可用连接池,与free_connection_n配合使用
ngx_connection_t *free_connections;
// 可用连接池中连接的总数
ngx_uint_t free_connection_n;
/* 双向链表容器,元素类型是ngx_connection_t结构体,表示可重复使用连接队列 */
ngx_queue_t reusable_connections_queue;
// 动态数组,每个数组元素储存着ngx_listening_t成员,表示监听端口及相关的参数
ngx_array_t listening;
/*
动态数组容器,它保存着nginx所有要操作的目录。如果有目录不存在,就会试图创建,而创建目录失败就会导致nginx启动失败。
*/
ngx_array_t pathes;
/*
单链表容器,元素类型是ngx_open_file_t 结构体,它表示nginx已经打开的所有文件。事实上,nginx框架不会向open_files链表中添加文件。
而是由对此感兴趣的模块向其中添加文件路径名,nginx框架会在ngx_init_cycle 方法中打开这些文件
*/
ngx_list_t open_files;
// 单链表容器,元素类型是ngx_shm_zone_t结构体,每个元素表示一块共享内存
ngx_list_t shared_memory;
// 当前进程中所有链接对象的总数,与connections成员配合使用
ngx_uint_t connection_n;
ngx_uint_t files_n;
// 指向当前进程中的所有连接对象,与connection_n配合使用
ngx_connection_t *connections;
// 指向当前进程中的所有读事件对象,connection_n同时表示所有读事件的总数
ngx_event_t *read_events;
// 指向当前进程中的所有写事件对象,connection_n同时表示所有写事件的总数
ngx_event_t *write_events;
/*
旧的ngx_cycle_t 对象用于引用上一个ngx_cycle_t 对象中的成员。例如ngx_init_cycle 方法,在启动初期,
需要建立一个临时的ngx_cycle_t对象保存一些变量,再调用ngx_init_cycle 方法时就可以把旧的ngx_cycle_t 对象传进去,
而这时old_cycle对象就会保存这个前期的ngx_cycle_t对象。
*/
ngx_cycle_t *old_cycle;
// 配置文件相对于安装目录的路径名称
ngx_str_t conf_file;
// nginx 处理配置文件时需要特殊处理的在命令行携带的参数,一般是-g 选项携带的参数
ngx_str_t conf_param;
// nginx配置文件所在目录的路径
ngx_str_t conf_prefix;
//nginx安装目录的路径
ngx_str_t prefix;
// 用于进程间同步的文件锁名称
ngx_str_t lock_file;
// 使用gethostname系统调用得到的主机名
ngx_str_t hostname;
};
module的数据类型如下:
struct ngx_module_s {
//对于一类模块(由下面的type成员决定类别)而言,ctx_index标示当前模块在这类模块中的序号。
//这个成员常常是由管理这类模块的一个nginx核心模块设置的,对于所有的HTTP模块而言,ctx_index
//是由核心模块ngx_http_module设置的。
ngx_uint_t ctx_index;
//index表示当前模块在ngx_modules数组中的序号。Nginx启动的时候会根据ngx_modules数组设置各个模块的index值
ngx_uint_t index;
//spare系列的保留变量,暂未使用
ngx_uint_t spare0;
ngx_uint_t spare1;
ngx_uint_t spare2;
ngx_uint_t spare3;
//nginx模块版本,目前只有一种,暂定为1
ngx_uint_t version;
//模块上下文,每个模块有不同模块上下文,每个模块都有自己的特性,而ctx会指向特定类型模块的公共接口。
//比如,在HTTP模块中,ctx需要指向ngx_http_module_t结构体。
void *ctx;
//模块命令集,将处理nginx.conf中的配置项
ngx_command_t *commands;
//标示该模块的类型,和ctx是紧密相关的。它的取值范围是以下几种:
//NGX_HTTP_MODULE,NGX_CORE_MODULE,NGX_CONF_MODULE,
//NGX_EVENT_MODULE,NGX_MAIL_MODULE
ngx_uint_t type;
//下面7个函数是nginx在启动,停止过程中的7个执行点
ngx_int_t (*init_master)(ngx_log_t *log); //初始化master
ngx_int_t (*init_module)(ngx_cycle_t *cycle); //初始化模块
ngx_int_t (*init_process)(ngx_cycle_t *cycle); //初始化进程
ngx_int_t (*init_thread)(ngx_cycle_t *cycle); //初始化线程
void (*exit_thread)(ngx_cycle_t *cycle); //退出线程
void (*exit_process)(ngx_cycle_t *cycle); //退出进程
void (*exit_master)(ngx_cycle_t *cycle); //退出master
//保留字段,无用,可以使用NGX_MODULE_V1_PADDING来替换
uintptr_t spare_hook0;
uintptr_t spare_hook1;
uintptr_t spare_hook2;
uintptr_t spare_hook3;
uintptr_t spare_hook4;
uintptr_t spare_hook5;
uintptr_t spare_hook6;
uintptr_t spare_hook7;
};
conf_ctx是各个模块的配置指针(三级指针).通过传入的module参数作为索引,从而取得对应的配置信息.