首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

nginx事件模块结构体详解

前言

事件模块是nginx的核心模块之一,nginx中客户端请求的处理和命令行指令的执行都是基于事件模块进行驱动的。因此,掌握事件模块的实现原理对于我们理解nginx整体架构有非常重要的意义。本文首先会讲解事件模块相关的几个模块定义及其执行流程进行讲解,其源码的讲解将会在后面的文章中进行。

nginx的事件核心模块主要有两个:和。这两个模块的主要区别在于,的类型为,其本质上虽然是核心模块类型,但是却是事件模块的一个驱动点,其解析的配置项为,并且会创建用于存储事件模块相关配置的结构体;而的类型则是,这个模块的配置对象中会存储事件模块的基础配置对象,其主要作用是解析配置块中的子配置项。下面我们就来看一下这两个模块的基础配置。

1. ngx_events_module

如下是模块的基础配置:

在模块的定义中,其module context指向的是,也即第二个结构体的配置,而module directives指向的则是ngx_events_commands,也即第三个结构体的定义。可以看到,中只定义了一个配置项,而这个配置项的类型为,也就是说其是一个配置块的类型,这里我们就理解了,这个command对应的就是我们在nginx.conf中使用的配置块,而这个配置块的解析则是通过方法进行的。

我们知道,在nginx的核心配置对象ngx_cycle_t中的conf_ctx数组中,每个模块在数组对应的位置都会有一个配置对象,同理,这里的核心模块也会有一个配置对象,但是上面的第二个结构体中的第二个属性值为NULL,也就是说这里的事件模块的定义中是没有创建配置对象的方法的,但是却有初始化配置对象的方法,也即第三个属性值方法。那么这里事件模块的配置对象是在哪里创建的呢?其实其就是在解析配置对象的时候进行的,也即在执行解析配置块的方法中进行的。该方法本质上只是创建了一个指针数组,然后将其赋值给nginx核心和值对象的ngx_cycle_t的conf_ctx的对应位置。

2. ngx_event_core_module

在介绍模块之前,我们首先需要讲解一下事件模块的接口定义:

nginx的事件模块主要有两个配置结构体:和两个。从上面的定义中可以看出,结构体是引用了的。的作用主要是创建和初始化当前模块所需要的配置结构体,而则主要定义了当前事件模块处理各个事件的方式,这个接口典型的实现接口是nginx定义的各个事件模型,比如epoll的和kqueue的。从这里就可以看出,事件模块的定义抽象了各个处理事件的模型的相关处理方法。

对于事件模块而言,其有一个模块是用于存储事件相关的基础配置的,即,虽然实现了接口,但是其不进行具体的事件处理。如下是模块的定义:

在事件模块的定义中,module context指向的是一个结构体,这里的的module context指向的就是第二个结构体定义的,而中则定义了当前核心模块创建配置对象和初始化配置对象的方法,可以看到,其actions属性中的值全部为NULL,这是因为该模块并不负责处理具体的事件处理方案,而是负责核心结构体的创建和初始化,nginx也会保证这个模块在所有的事件模块中最先被调用,其余各个事件模块也可以引用该模块所存储的基础配置数据。

在中第三个属性指向的是上面的第三个结构体,这个结构体中定义了当前事件模块所能使用的各个配置项的基本配置以及解析这些配置项的方法。

这里我们需要着重强调中的第六个和第七个属性,这两个属性指向的是都是某个方法,第六个属性init module的主要是在nginx启动过程中解析完nginx.conf配置文件之后执行,其作用是对当前模块进行初始化的工作,而第七个属性init process主要是在nginx启动worker进程之后worker进程开始执行主循环之前调用的,其作用是进行worker进程执行前的初始化工作。

3. 模块方法的执行流程

通过上面的介绍我们大致了解了定义事件模块的两个核心模块的主要方法及其作用,这里则主要是对这些方法的执行流程进行讲解,如下是其流程示意图:

对于上面的,这里需要对其各个步骤的功能进行说明:

解析nginx.conf文件,当遇到events配置项时,就使用ngx_evetns_block()方法对其进行解析;

创建用于存储各个事件模块存储配置项的结构体的数组;

采用递归的方式解析events配置块中的子配置项;

依次检查事件核心模块的配置项,如果其没有赋值,则对其赋一个默认值;

检查是否创建了存储事件模块配置项的数组,该检查的主要目的是判断核心模块是否成功初始化了;

主要是通过解析得到的配置项,设置诸如时间定时器的执行频率、可打开的文件句柄限制和初始化记录统计数据的属性;

在worker进程中调用,用于初始化worker进程运行所需要的环境,比如初始化事件队列、初始化事件模型、添加时间更新的定时任务等;

4. 小结

本文首先对nginx事件模块的核心结构体的基本配置和作用进行了详细讲解,然后讲解了这些配置方法的调用流程,并且讲解了各个流程方法的主要作用,下一篇文章将会详细讲解这些流程的具体实现原理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230504A07VW700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券