nginx模块化结构分析

nginx模块化设计

模块化设计是nginx的架构基础。在nginx中,除了少量核心代码,其他一切皆为模块。
nginx定义模块的方式很简单,例如:

ngx_module_t ngx_http_test_module;

其中,ngx_module_t是nginx模块的数据结构,由于本文主要介绍nginx的模块化设计结构,所有只介绍两个成员:

typedef struct ngx_module_s ngx_module_t;
struct ngx_module_s {
    ...
    
    //nginx模块有很多种,不同模块间的功能差别很大,而ctx将会指向特定模块的公共接口。
    void                 *ctx;
    //type表示模块的类型,与ctx指针紧密相关。官方nginx中,它的取值范围是以下5种:
    //NGX_CORE_MODULE
    //NGX_CONF_MODULE
    //NGX_EVENT_MODULE
    //NGX_HTTP_MODULE
    //NGX_MAIL_MODULE
    ngx_uint_t            type;
    
    ...
};

变量type的五种取值对应官方nginx模块的五大类型:核心模块、配置模块、事件模块、http模块、mail模块。也就是说nginx通过对模块数据结构ngx_module_t中ctx和type的不同赋值,实现不同的模块类型。

五大模块

核心模块和配置模块类型是由nginx的框架代码所定义的,nginx框架会调用核心模块,而配置模块是所有模块的基础,它实现基本的配置文件解析功能。事件模块、http模块和mail模块的共性是在核心模块中各有一个模块作为自己的代言人,并在自身所有同类模块中有一个作为核心业务与管理功能的模块。
1、核心模块
核心模块把ctx实例化为ngx_core_module_t结构体,代码如下:

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

对应type的值为NGX_CORE_MODULE。然后就可以再此基础上定义多个此类模块(ctx和type相同)。

ngx_module_t  ngx_core_module = {
    NGX_MODULE_V1,
    &ngx_core_module_ctx,       //ctx:ngx_core_module_t
    ngx_core_commands,
    NGX_CORE_MODULE,            //type
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NGX_MODULE_V1_PADDING
};

核心模块一共有6个:

ngx_module_t  ngx_core_module;   //同上
ngx_module_t  ngx_events_module; //事件模块“代言人”
ngx_module_t  ngx_http_module;   //http模块“代言人”
ngx_module_t  ngx_mail_module;   //mail模块“代言人”
ngx_module_t  ngx_openssl_module;
ngx_module_t  ngx_errlog_module;

2、配置模块
由于配置模块只有一个只拥有1个模块,所有并没有具体化实现ctx上下文成员,如下:

ngx_module_t  ngx_conf_module = {
    NGX_MODULE_V1,
    NULL,             //这个成员就是ctx,直接设置为NULL
    ngx_conf_commands,
    NGX_CONF_MODULE,  //type
    NULL,
    NULL,
    NULL, 
    NULL, 
    NULL,
    ngx_conf_flush_files,
    NULL,
    NGX_MODULE_V1_PADDING
};

3、事件模块

ngx_module_t  ngx_event_core_module = {
    NGX_MODULE_V1,
    &ngx_event_core_module_ctx,    //ctx:ngx_http_module_t
    ngx_event_core_commands,
    NGX_EVENT_MODULE,              //type
    NULL,
    ngx_event_module_init,
    ngx_event_process_init,
    NULL,
    NULL,
    NULL,
    NULL,
    NGX_MODULE_V1_PADDING
};

所有事件模块的加载操作是ngx_event_core_module负责。
4、http模块

{
    NGX_MODULE_V1,
    &ngx_http_core_module_ctx, //ctx:ngx_http_module_t
    ngx_http_core_commands,
    NGX_HTTP_MODULE,           //type
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NULL,
    NGX_MODULE_V1_PADDING
};

和事件模块不同的是,负责加载http模块的是核心模块中的“代言人”:ngx_http_module模块,而ngx_http_core_module负责处理核心逻辑和具体的请求该分配给哪个http模块。
5、mail模块
mail模块较为独立,不做过多介绍。

综上:核心模块和配置模块负责和nginx框架对接,是其他模块的基础。而事件模块则是http模块和mail模块的基础,后两者则更关注应用层面。

关系图

nginx五大模块

命名关系

ctx具体实现后的4种数据结构命名: ngx_core_module_t、 ngx_event_module_t、 ngx_http_module_t、 ngx_mail_module_t。

type的5种名称: NGX_CORE_MODULE、NGX_CONF_MODULE、NGX_EVENT_MODULE、NGX_HTTP_MODULE、NGX_MAIL_MODULE。

6个核心模块命名: ngx_event_module、ngx_http_module、ngx_mail_module、ngx_openssl_module、ngx_errlog_module、ngx_core_module。

3个同类模块种的管理模块命名: ngx_event_core_module、ngx_http_core_module、ngx_mail_core_module。

参考

深入理解Nginx模块开发与架构解析 第二版 陶辉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值