在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。



后面的几个全局变量都是比较简单的类型, 这里就不写读后感了。后面研读的过程中遇到再带上一笔。