在nginx.c中的main函数开始之前定义了一些列的全局性的变量,下面一一介绍每个变量的意义和作用.
以上截图可以看出, nginx.c中定义了以下全局性的变量:
- ngx_core_commands : 核心指令集变量
- ngx_core_module_ctx : 核心模块上下文变量
- ngx_core_module : 核心模块变量
- ngx_show_help : 无符号整型, 标记是否显示帮助
- ngx_show_version : 无符号整数, 标记是否显示帮助
- ngx_show_configure : 无符号整数, 标记是否显示配置
- ngx_prefix : 字符串, nginx前缀
- ngx_conf_file : 字符串,保存nginx配置文件字符串
- ngx_conf_params : 字符串, 保存nginx配置的参数, 应该是来自命令行的参数
- ngx_signal : 信号字符串
- ngx_os_environ : nginx操作系统的信息
ngx_core_commands: 已经在前面的一篇文章中介绍过。
ngx_core_module_ctx 核心模块上下文:
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conf
// 具体定义见./src/core/ngx_conf_file.h文件
// 下面是定义全局的核心模块上下文ngx_core_module_ctx
static ngx_core_module_t ngx_core_module_ctx = {
ngx_string("core"), // 模块名称
ngx_core_module_create_conf, // 创建配置的指针函数
ngx_core_module_init_conf // 初始化配置的指针函数
};
下面我们看看ngx_core_module_t的定义:
// ngx_core_module_t是核心模块结构体,包含一个模块名称以及两个指针函数create_conf和init_conf
typedef struct {
ngx_str_t name;
void *(*create_conf)(ngx_cycle_t *cycle);
char *(*init_conf)(ngx_cycle_t *cycle, void *conf);
} ngx_core_module_t;
ngx_core_module 核心模块对象:
// 下面定义核心模块全局变量
ngx_module_t ngx_core_module = {
NGX_MODULE_V1, // 前面七个字段使用NGX_MODULE_V1一次性填充起来
&ngx_core_module_ctx, // 模块的上下文, 即上面定义的ngx_core_module_ctx变量
ngx_core_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_t类型, 下面我们仔细看看这个结构体的定义:
// 具体可参见nginx-modules-and-init文件
#define NGX_MODULE_V1 0, 0, 0, 0, 0, 0, 1 //使用这个值初始化模块前面7个字段的值
#define NGX_MODULE_V1_PADDING 0, 0, 0, 0, 0, 0, 0, 0 //使用这个值初始化模块最后面的8个字段的值
struct ngx_module_s {
ngx_uint_t ctx_index; //分类模块计数器
ngx_uint_t index; //模块计数器
ngx_uint_t spare0; //替补0
ngx_uint_t spare1; //替补1
ngx_uint_t spare2;
ngx_uint_t spare3;
ngx_uint_t version; //版本
void *ctx; //该模块的上下文,每个种类的模块有不同的上下文
ngx_command_t *commands; //该模块的命令集,指向一个ngx_command_t结构数组
ngx_uint_t type; //该模块的种类,为core/event/http/mail中的一种
//以下是一些callback函数
ngx_int_t (*init_master)(ngx_log_t *log); //初始化master
ngx_int_t (*init_module)(ngx_cycle_t *cycle); //初始化模块
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); //退出master
uintptr_t spare_hook0; //替补钩子0
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;
};
该结构体前面7个字段都是nginx无符号整型, 分别为分类模块计数器,模块计数器,四个占位替补, 一个版本整数。 一般情况下定义变量初始化的时候都是使用 NGX_MODULE_V1 来填充, 一次性填充7个字段的初始值。
- ctx : 模块上下文, 每个种类的模块有不同的上下文
- commands : 该模块对应的命令集, 指向ngx_command_t结构体数组
- type : 模块的类型, 为core, event, http或mail中的一种。
- init_master : 初始化master的时候的回调函数
- init_module : 初始化该模块的时候的回调函数
- init_process : 初始化进程的时候的回调函数
- init_thread : 初始化线程的回调函数
- exit_thread : 退出线程的回调函数
- exit_process : 退出工作进程的回调函数
- exit_master: 退出master的回调函数
以上为每个新定义ngx_module_t变量时候需要设置的一些域。
上面的回调函数, 个人理解有点类似一些钩子系统, 给你的模块有机会在nginx的每个不同的阶段进行一些特殊的工作处理。 比如在主进程master初始化的时候, 以及主进程退出的时候, 比如可以做模块及的初始化或者清理之类的工作。 这里不一定说的准哈, 还没有看到后面的实现, 暂且把现在的感觉写下来,后续做修改。
最后面又保留8个位的替补, 估计是nginx想留到后面做扩展用的吧? 这8个位一般也使用一个宏来一次性初始化 NGX_MODULE_V1_PADDING.
到这里基本明白了ngx_module_t的结构和含义, 那么回头再看看ngx_core_module的定义, 你会发现它仅仅定义了上下文, 相关的核心命令集, 以及属于核心模块core。
后面的几个全局变量都是比较简单的类型, 这里就不写读后感了。后面研读的过程中遇到再带上一笔。