Nginx源码分析-ngx_module_s结构体
该结构体是整个Nginx模块化架构最基本的数据结构体。它描述了Nginx程序中一个模块应该包括的基本属性,在tengine/src/core/ngx_conf_file.h中定义了该结构体
105 struct ngx_module_s { 106 ngx_uint_t ctx_index; // 所属分类标识.Nginx的模块分为4种,分别是core,http,event和mail,每个模块在使用的技术各不尽相同 107 ngx_uint_t index; //模块计数器,Nginx为了方便管理模块,定义了一个存放所有模块的数组ngx_modules[];
// /objs/ngx_modules.c包含了此版本快速编译后所有模块的声明。 108 109 ngx_uint_t spare0; 110 ngx_uint_t spare1; 111 ngx_uint_t abi_compatibility; 112 113 ngx_uint_t major_version; //模块版本 114 ngx_uint_t minor_version; 115 116 void *ctx; //模块上下文,不同模块的模块上下文结构不同 117 ngx_command_t *commands; // 模块支持的命令集 118 ngx_uint_t type; // 模块的种类 119 //回调函数 如果该模块需要发生这些行为时执行特定的功能,可以通过这些回调函数指针注册一个回调函数接口
// 来实现 120 ngx_int_t (*init_master)(ngx_log_t *log); // 主进程初始化时调用 121 122 ngx_int_t (*init_module)(ngx_cycle_t *cycle); // 模块初始化时调用 123 124 ngx_int_t (*init_process)(ngx_cycle_t *cycle); // 工作进程初始化时调用 125 ngx_int_t (*init_thread)(ngx_cycle_t *cycle); // 线程初始化时调用 126 void (*exit_thread)(ngx_cycle_t *cycle); // 线程退出时调用 127 void (*exit_process)(ngx_cycle_t *cycle); // 工作进程退出时调用 128 129 void (*exit_master)(ngx_cycle_t *cycle); // 主进程退出时调用 130 // 以下预留成员暂未使用 131 uintptr_t spare_hook0; 132 uintptr_t spare_hook1; 133 uintptr_t spare_hook2; 134 uintptr_t spare_hook3; 135 uintptr_t spare_hook4; 136 uintptr_t spare_hook5; 137 uintptr_t spare_hook6; 138 uintptr_t spare_hook7; 139 };
该结构体在初始化时,需要用到两个宏定义,在该文件中也能找到:
101 #define NGX_MODULE_V1 0, 0, 0, 0, \ 102 NGX_DSO_ABI_COMPATIBILITY, NGX_NUMBER_MAJOR, NGX_NUMBER_MINOR //前七个成员的初始化 103 #define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 //后八个成员的初始化