模块及其初始化

1.nginx的模块:
nginx是由各种各样的模块组成,有些模块是默认就会编译进去的,而有些模块则需要通过./configure –with的方式编译进去,所有模块都会被放在一个ngx_moudule[]的全局指针数组里面,数组中的每一个元素都是ngx_module_t的结构体,每个种类的模块有不同的上下文ctx,每个模块有自己支持的命令集ngx_command_t,且在每一个数据结构里面都封装了大量的函数指针,支持相应的回调
2.nginx的模块种类:
主要有五大种类的模块:
NGX_CORE_MODULE
NGX_CONF_MODULE
NGX_EVENT_MODULE
NGX_HTTP_MODULE
NGX_MAIL_MODULE
每个模块的type字段通过该宏进行初始化
3.模块的初始化
就是对ngx_module_t的初始化
包括静态初始化和动态初始化
1》静态初始化:即编译期间完成的初始化
(1) 用宏NGX_MODULE_V1初始化前7个字段
(2) 用全局对象ngx_mname_module_ctx的地址初始化ctx指针
(3) 用全局数组ngx_mname_commands[]初始化commands指针
(4) 用宏NGX_CORE_MODULE等初始化type字段
(5) 初始化init_master等callback
(6) 用宏NGX_MODULE_V1_PADDING初始化最后8个字段
也即在定义该模块时,把它的index和ctx_index初始化为0,初始化模块上下文,模块命令集,模块类型
2》动态初始化:即nginx启动运行期间的初始化
(1)初始化index字段
ngx_max_module = 0;
00326: for (i = 0; ngx_modules[i]; i++) {
00327: ngx_modules[i]->index = ngx_max_module++;
00328: }
每个模块的index就是它对应数组下标的值,全局变量ngx_max_module就是总的模块个数
详细见core模块的初始化
(2)ctx_index的初始化
对于event类型的模块调用ngx_events_block
详细见event模块的初始化
对于http类型的调用ngx_http_block
详细见http类型的初始化
对于mail类型的调用ngx_mail_block

你可能感兴趣的:(nginx源码分析,模块初始化)