Nginx源码初探之数据结构 - 模块数据结构

        Nginx架构最大的特点就是模块化结构体系,ngx_module_s定义了一个模块应该包含的基础属性,包括名称,版本,指令,类型,进程管理,线程管理等内容。

1.数据结构

struct ngx_module_s {
    /*前七个属性对应于宏NGX_MODULE_V1*/
    ngx_uint_t            ctx_index;/*模块标识,每个模块的唯一标识,*/
    ngx_uint_t            index;/**/

    char                 *name;/**/

    ngx_uint_t            spare0;/**/
    ngx_uint_t            spare1;/**/

    ngx_uint_t            version;/**/
    const char           *signature;/**/

    void                 *ctx;/*模块上下文*/
    ngx_command_t        *commands;/*模块支持的命令,ngx_command_t类型的数组*/
    ngx_uint_t            type;/*模块类型,不同的模块去取不同的类型*/
/*这部分结构顺序和模块的生命周期是一致的*/
    ngx_int_t           (*init_master)(ngx_log_t *log);/*初始化master*/

    ngx_int_t           (*init_module)(ngx_cycle_t *cycle);/*初始化module*/

    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);/*初始化worker进程*/
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);/*初始化线程时调用,比如connection,request线程*/
    void                (*exit_thread)(ngx_cycle_t *cycle);/*退出线程时调用*/
    void                (*exit_process)(ngx_cycle_t *cycle);/*退出worker进程*/

    void                (*exit_master)(ngx_cycle_t *cycle);/*退出master*/
    /*后八个属性对应于宏NGX_MODULE_V1_PADDING*/
    uintptr_t             spare_hook0;
    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;
};

2.模块的定义(以http模块为例)

ngx_module_t  ngx_http_module = {
    NGX_MODULE_V1,
    &ngx_http_module_ctx,                  /* module context */
    ngx_http_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_V1和NGX_MODULE_V1_PADDING是宏定义,ngx_http_commands是http支持的命令集合。
3.模块层次化结构
          Nginx的模块之间具有严格的层级关系,Nginx的核心框架代码只管NGX_CORE_MODULE模块,核心模块对应的类型管理器管理下一层级类型的模块,比如HTTP模块(ngx_http_module)管理NGX_HTTP_MODULE类型模块;事件模块(ngx_event_module)管理NGX_EVENT_MODULE类型模块;邮件模块(ngx_mail_module)管理NGX_MAIL_MODULE类型的模块;STREAM模块(ngx_stream_module)管理NGX_STREAM_MODULE类型的模块。

发布了8 篇原创文章 · 获赞 0 · 访问量 118

猜你喜欢

转载自blog.csdn.net/mlydaemon/article/details/103925770