nginx架构总结--nginx源码系列(一)

总述:
nginx自身是高度模块化设计的,我们可以方便的开发任何基于tcp的模块(比如http模块,mail模块)。
注: 一、开发一个nginx模块,必须遵守的原则有:1、实现模块开发的接口 2、不能有阻塞的系统调用
二、web服务器提高网络效率的方法有:1、使用长连接(keepalive)代替短连接,减少建立、关闭连接带来的开销
2、使用压缩算法来增加相同吞吐量下的信息携带量;3、使用缓存来减少网络交互次数
nginx总结起来就是一个框架和五类模块

一、nginx的模块化设计
nginx的框架代码只占少部分,主要负责建立进程模型并使各个模块有序的执行,当然还包括一系列资源初始化和回收(从某种意义上来说,nginx自定义的数据结构和对系统调用的封装也可以视为框架代码)。
所有的模块都遵循着同样的ngx_module_t接口设计规范

//ngx_module_s是模块的定义
struct ngx_module_s {
    //对于一类模块(由下面的type成员决定类别)而言,ctx_index标示当前模块在这类模块中的序号。
    //这个成员常常是由管理这类模块的一个nginx核心模块设置的,对于所有的HTTP模块而言,ctx_index
    //是由核心模块ngx_http_module设置的。
    ngx_uint_t            ctx_index;

    //index表示当前模块在ngx_modules数组中的序号。Nginx启动的时候会根据ngx_modules数组设置各个模块的index值
    ngx_uint_t            index; 

    //spare系列的保留变量,暂未使用
    ngx_uint_t            spare0;
    ngx_uint_t            spare1;
    ngx_uint_t            spare2;
    ngx_uint_t            spare3;

    //nginx模块版本,目前只有一种,暂定为1
    ngx_uint_t            version;

    //模块上下文,每个模块有不同模块上下文,每个模块都有自己的特性,而ctx会指向特定类型模块的公共接口。
    //比如,在HTTP模块中,ctx需要指向ngx_http_module_t结构体。
    void                 *ctx;

    //模块命令集,将处理nginx.conf中的配置项
    ngx_command_t        *commands;

    //标示该模块的类型,和ctx是紧密相关的。它的取值范围是以下几种:
    //NGX_HTTP_MODULE,NGX_CORE_MODULE,NGX_CONF_MODULE,
    //NGX_EVENT_MODULE,NGX_MAIL_MODULE
    ngx_uint_t            type;

    //下面7个函数是nginx在启动,停止过程中的7个执行点
    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

    //保留字段,无用,可以使用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;
};

基本接口ngx_module_t只涉及模块的初始化、退出以及对配置项的处理。如上代码所示,ngx_module_t结构体作为所有模块的通用接口,只定义了init_master 、init_module、init_process、init_thread、exit_thread、exit_process、exit_master这七个回调方法,而init_master 、init_thread、exit_thread这三个方法目前没有使用,后两个是因为nginx目前没有使用线程(因为多线程代码实现更难控制)。他们负责模块的初始化和退出,同时他们可以处理核心结构体ngx_cycle_t(每个进程都有一个该结构体变量)。而ngx_command_t类型的commands数组指定了模块中的配置名和模块处理配置变量的方法,ctx是一个void*指针,他表示一类模块所特有的通用函数接口。
这里写图片描述
上图包括核心、事件、http、mail四类模块的ctx上下文(配置模块的ctx上下文为空),和ngx_command_t结构。
配置模块是唯一一种只有一个模块的模块类型,这是nginx最底层的模块,他指导着所有模块以配置项为核心来提供功能。因此,他是所有其他模块的基础(但是,单就conf模块对ngx_module_t接口的实现情况来说,他只是实现了include命令,以及进程退出时执行的一个回调方法)。
核心类型的模块一共只有六个:ngx_core_module、ngx_errlog、ngx_events_module、ngx_openssl_module、ngx_http_module、ngx_mail_module。非模块的框架代码只关注于如何调用六个核心模块(大部分nginx模块都是非核心模块)。

typedef struct {
    ngx_str_t             name;                                         //模块名,即ngx_core_module_ctx结构体对象的
    void               *(*create_conf)(ngx_cycle_t *cycle);             //解析配置项前,nginx框架会调用create_conf方法
    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);   //解析配置项完成后,nginx框架会调用init_conf方法
} ngx_core_module_t;

ngx_core_module_t上下文是以配置项的解析作为基础的,它提供了create_conf回调方法来创建存储配置项的数据结构,在读取nginx.conf配置文件时,会根据模块中的ngx_command_t把解析出的配置项存放在这个数据结构中;他还提供了init_conf回调方法,用于在解析完配置文件后,使用解析出的配置项初始化模块功能。(但是,很多核心模块,比如http,event,mail并没有实现这个接口,而是在解析配置的时候,比如解析http命令时,调用命令处理函数来创建数据结构和初始化模块功能,http还会在回调函数里创建http模块类型的上下文以及初始化http类的那些模块中的一些属性)。
配置模块和核心模块这两类模块是由nginx的框架代码所定义的,这里的配置模块是所有模块的基础,他实现了最基本的配置项解析功能(就是解析nginx.conf文件)。其他三类模块都不会与框架产生直接关系。事件,http,mail这三类模块,都在核心模块中各有一个模块作为自己的”代言人“,并在同类模块中还有一个作为核心业务与管理功能的模块。

注:每个ngx_listening_t都有一个ngx_connection_t与之对应,反过来则不然。这样是为了使监听套接字操作起来和 连接套接字一样。完全是为了使监听套接字上的事件(只有可读事件)处理和连接套接字统一。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值