Nginx源码剖析-模块以及部分初始化

    xiaoxiao2021-03-25  55

    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模块可以分为四种:coreeventhttpmail 

    (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;  

    其实可以将ngx_module_t看作一个类,数字字段是属性,callback回调函数当作方法;

    (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结构)和类型,也对模块的初始化有了进一步的了解。

    转载请注明原文地址: https://ju.6miu.com/read-39677.html

    最新回复(0)