nginx.c中的全局变量分析

来源:互联网 发布:php导出excel表格下载 编辑:程序博客网 时间:2024/06/05 05:55

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



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

原创粉丝点击