Nginx架构最大的特点就是模块化结构体系,ngx_module_s定义了一个模块应该包含的基础属性,包括名称,版本,指令,类型,进程管理,线程管理等内容。
1.数据结构
struct ngx_module_s {
/*前七个属性对应于宏NGX_MODULE_V1*/
ngx_uint_t ctx_index;/*模块标识,每个模块的唯一标识,*/
ngx_uint_t index;/**/
char *name;/**/
ngx_uint_t spare0;/**/
ngx_uint_t spare1;/**/
ngx_uint_t version;/**/
const char *signature;/**/
void *ctx;/*模块上下文*/
ngx_command_t *commands;/*模块支持的命令,ngx_command_t类型的数组*/
ngx_uint_t type;/*模块类型,不同的模块去取不同的类型*/
/*这部分结构顺序和模块的生命周期是一致的*/
ngx_int_t (*init_master)(ngx_log_t *log);/*初始化master*/
ngx_int_t (*init_module)(ngx_cycle_t *cycle);/*初始化module*/
ngx_int_t (*init_process)(ngx_cycle_t *cycle);/*初始化worker进程*/
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);/*初始化线程时调用,比如connection,request线程*/
void (*exit_thread)(ngx_cycle_t *cycle);/*退出线程时调用*/
void (*exit_process)(ngx_cycle_t *cycle);/*退出worker进程*/
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;
};
2.模块的定义(以http模块为例)
ngx_module_t ngx_http_module = {
NGX_MODULE_V1,
&ngx_http_module_ctx, /* module context */
ngx_http_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
};
关键字NGX_MODULE_V1和NGX_MODULE_V1_PADDING是宏定义,ngx_http_commands是http支持的命令集合。
3.模块层次化结构
Nginx的模块之间具有严格的层级关系,Nginx的核心框架代码只管NGX_CORE_MODULE模块,核心模块对应的类型管理器管理下一层级类型的模块,比如HTTP模块(ngx_http_module)管理NGX_HTTP_MODULE类型模块;事件模块(ngx_event_module)管理NGX_EVENT_MODULE类型模块;邮件模块(ngx_mail_module)管理NGX_MAIL_MODULE类型的模块;STREAM模块(ngx_stream_module)管理NGX_STREAM_MODULE类型的模块。