1. nginx有哪些模块:
在ngx_modules.c文件中,声明了nginx中配置的所有模块。
2 nginx如何描述这些模块,以及相关结构总结。
(1) ngx_module_t结构:nginx中最基本的数据结构:(模块计数,模块的上下文,由于模块有五个不同种类,所以每个种类的模块都有不同的上下文)
(1) struct ngx_module_s {
(2) ngx_uint_t ctx_index;
(3) /*分类的模块计数器
(4) nginx模块可以分为四种:core、event、http和mail
(5) 每个模块都会各自计数,ctx_index就是每个模块在其所属类组的计数*/
(6) ngx_uint_t index;
(7) /*一个模块计数器,按照每个模块在ngx_modules[]数组中的声明顺序,从0开始依次给每个模块赋值*/
(9) ngx_uint_t spare0;
(10) ngx_uint_t spare1;
(11) ngx_uint_t spare2;
(12) ngx_uint_t spare3;
(13) ngx_uint_t version; //nginx模块版本
(14) void *ctx;
(15) /*模块的上下文,不同种类的模块有不同的上下文,因此实现了四种结构体*/
(16) ngx_command_t *commands;
(17) /*模块的指令集,指向ngx_conmand_t类型的数组*/
(18) ngx_uint_t type; //模块类型,用于区分不同类型
(19) ngx_int_t (*init_master)(ngx_log_t *log); //初始化master时执行
(20) ngx_int_t (*init_module)(ngx_cycle_t *cycle); //初始化module时执行
(22) ngx_int_t (*init_process)(ngx_cycle_t *cycle); //初始化process时执行
(23) ngx_int_t (*init_thread)(ngx_cycle_t *cycle); //初始化thread时执行
(24) void (*exit_thread)(ngx_cycle_t *cycle); //退出thread时执行
(25) void (*exit_process)(ngx_cycle_t *cycle); //退出process时执行
(26) void (*exit_master)(ngx_cycle_t *cycle); //退出master时执行
(27) //以下功能不明
(28) uintptr_t spare_hook0;
(29) uintptr_t spare_hook1;
(30) uintptr_t spare_hook2;
(31) uintptr_t spare_hook3;
(32) uintptr_t spare_hook4;
(33) uintptr_t spare_hook5;
(34) uintptr_t spare_hook6;
(35) uintptr_t spare_hook7;
(36) };
(37) typedef struct ngx_module_s ngx_module_t;
(2)ngx_command_t结构(在module结构中有一个指针指向了ngx_command_t 结构)
3. 如何组织这些模块?
将这些模块保存在一个全局指针数组ngx_modules[]中,数组的每一个元素都为全局ngx_module_t对象的指针;在对全局指针数组初始化时,对每个模块都进行了静态初始化;
4. Nginx的模块种类有哪些?
共有5种类型:CORE,CONF,EVNT,HTTP,MAIL
对模块中“Type”进行初始化时,通过宏进行,分别用16进制数
define NGX_CORE_MODULE 0x45524F43
define NGX_CONF_MODULE 0x464E4F43
define NGX_EVNT_MODULE 0x544E5645
define NGX_HTTP_MODULE 0x50545448
define NGX_MAIL_MODULE 0x4c49414d
5. 如何初始化这些模块?(Name仅表示五种类型名之一)
(1) 静态初始化:其实就是初始化类型,模块的上下文,命令集
1-用宏NGX_MODULE_VI初始化前7个字段;
2-用全局对象ngx_Name_module_ctx对ctx指针进行初始化;
3-用全局数组ngx_Name_commands[]初始化commands指针;
4-用NGX_Name_MODULE对Type进程类型的初始化;
5-初始化callback;
6-初始化后8个字段;
此时静态初始化对index,ctx_index等初始化为0;
(2) 动态初始化:初始化index(模块计数器),ctx_index(分类模块计数器)等
小结:本部分主要理解了nginx中模块的含义,以及一些基本结构(主要是ngx_moudle结构)和类型,也对模块的初始化有了进一步的了解。