1. 重要的数据结构
1. ngx_module_t
nginx中所有模块的类型都是ngx_module_t类型的,定义了模块的一些属性。nginx是完全模块化的,所有的组件都是模块,从而实现了nginx的高度松耦合。同时,我们在进行nginx模块开发时,也离不开这个数据结构。
struct ngx_module_s {
/**
* 在具体类型模块(http、event等)的全局配置结构数组的下标。以http module模块为例,
* nginx把所有的http module的config信息存放在ngx_http_conf_ctx_t类型的变量中,
* 这个变量只有3个属性,分别是所有http module的main、srv、loc的config信息的数组。
* 如果该模块是http module,则ctx_index是该模块的config信息(main、srv、loc)
* 在ngx_http_conf_ctx_t中的下标。
*/
ngx_uint_t ctx_index;
/**
* nginx把所有模块(ngx_module_t)存放到ngx_modules数组中,这个数组在nginx源码路
* 径的objs/ngx_modules.c中,是在运行configure脚本后生成的。index属性就是该模块
* 在ngx_modules数组中的下标。同时nginx把所有的core module的配置结构存放到ngx_cycle的
* conf_ctx数组中,index也是该模块的配置结构在ngx_cycle->conf_ctx数组中的下标。
*/
ngx_uint_t index;
……
/**
* 模块的上下文属性,同一类型的模块的属性是相同的,比如core module的ctx是ngx_core_module_t类型。
* 而http module的ctx是ngx_http_moduel_t类型,event module的ctx是ngx_event_module_t类型等等。
* 相应类型的模块由分开处理的,比如所有的http module由ngx_http_module解析处理,而所有的event module
* 由ngx_events_module解析处理。
*/
void *ctx;
/**
* 该模块支持的指令的数组,最后以一个空指令结尾。ngx_commond_t的分析见下文。
*/
ngx_command_t *commands;
/**
* 模块的类型,nginx所有的模块类型:
* NGX_CORE_MODULE
* NGX_CONF_MODULE
* NGX_HTTP_MODULE
* NGX_EVENT_MODULE
* NGX_MAIL_MODULE
* 这些不同的类型也指定了不同的ctx。
*/
ngx_uint_t type;
/* 接下来都是一些回调函数,在nginx初始化过程的特定时间点调用 */
ngx_int_t (*init_master)(ngx_log_t *log);
/* 初始化完所有模块后调用,在ngx_int_cycle函数(ngx_cycle.c)中 */
ngx_int_t (*init_module)(ngx_cycle_t *cycle);
/* 初始化完worker进程后调用,在ngx_worker_process_init函数(ngx_process_cycle.c)中 */
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);
……
};
下面的表格是type与ctx的对应关系:
模块类型(type) | 上下文属性类型(ctx) |
NGX_CORE_MODULE
|
ngx_core_module_t(ngx_conf_file.h)
|
NGX_CONF_MODULE
|
NULL |
NGX_HTTP_MODULE
|
ngx_http_module_t(http/ngx_http_config.h)
|
NGX_EVENT_MODULE
|
ngx_event_module_t(event/ngx_event.h)
|
NGX_MAIL_MODULE
|
ngx_mail_module_t(mail/ngx_mail.h) |