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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值