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

nginx事件模块第三篇

微信公众号:郑尔多斯

关注可了解更多的知识。任何问题或建议,请公众号留言;

关注公众号,有趣有内涵的文章第一时间送达!

内容回顾

前面的几篇文章中,我们介绍了的事件模块的基础知识。我们知道中包含了三个与事件相关的,分别为,,。我们也分别分析了这三个模块的配置文件的解析过程,从本篇文章开始,将详细分析的事件处理过程,比如如何添加事件,删除事件,处理事件等。

事件处理的概述

事件处理模块的主要解决的问题是如何收集,分发以及管理事件。在中,事件主要包含网络事件和定时器事件。当然还有其他事件,比如进程和进程通信也是使用事件机制来完成的,但是我们的关注点主要在前两种事件,第三种事件以后会分析。前面我们分析了是如何解析配置文件中与事件有关的配置项的,我们知道,当遇到的时候,表示开始处理事件配置项了。

事件和连接

作为web服务器,每一个用户请求至少对应一个连接,每个连接都包含一个毒事件和一个写事件。这样epoll就可以根据触发的事件类型来调度相应的模块进行处理。连接分为主动连接和被动连接。分别用和结构体来表示。

主动连接: 客户端发起,服务器被动接受的连接

被动连接: 作为客户端,向上游服务器发起的连接

本系列文章所介绍的连接都是被动连接,即作为服务器被动的接受客户端发起的连接。

Nginx连接池

为了提高效率,在启动的时候,会创建好连接池和对应的读写事件,并且将每个连接都和对应的读写事件对应起来。这样的话,在后面使用到连接的时候,只需要从连接池中获取一个空闲的连接就行了。那么是在什么时候创建了连接池和读写事件呢?

前面两篇文章我们介绍了, , 的配置项解析过程,以及, 方法。我们知道结构体有中有许多钩子函数,其中有一个钩子函数为,这个方法会在启动过程中调用。在模式下,当创建了进程之后,会在进程的初始化过程中调用。

通过源码可以发现,与事件机制相关的三个模块中,只有有一个钩子函数,为。其他两个模块都没有对应的钩子函数。

具体的调用过程如下:

调用init_process()方法

ngx_event_process_init

下面我们就分析一下这个这个方法。

这个函数的主要逻辑如下;

获取我们的全局配置结构体和事件模块的配置结构体

初始化和,这两个都是队列,用来保存需要滞后处理的连接和事件。

初始化时间红黑树

遍历所有的模块,找到我们选择的事件模块,比如模块,然后调用该事件模块的方法(该方法下一篇文件进行分析)

对时间参数进行处理(之后分析这部分)

, , 进行处理

对中的监听端口分配

下面我们看一下connectionread eventwrite event`的生成逻辑,如下:

上面的代码很简单,就是根据配置文件中的参数,生成对应数量的连接数,并根据下标将连接和读写事件相关联。并把空闲连接的放置在free_connection链表中

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券