Nginx 网络事件模型

本文探讨了Nginx服务器如何基于事件驱动模型处理Web请求,详细解释了网络收发与Nginx事件间的对应关系,并通过实例演示了三次握手过程中触发的事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络收发与Nginx事件间的对应关系


 请求建立TCP事件其实是发送的TCP报文到达了Nginx,所以其实是一个读事件,对于Nginx来说读取到了报文就是Accept建立连接的事件。TCP可读事件也就是对于Nginx发送了消息其实也是一个读事件,也就是Read读消息。如果浏览器主动关闭了,那么windows操作系统会去发送一个关闭连接的事件对于Nginx来说还是一个读事件,因为只是读取一个报文。

当Nginx要向浏览器发送响应的时候,需要将消息写到操作系统当中,然后发送到网络当中这就是一个写事件。

 

Nginx中的事件驱动模型


Nginx服务器响应和处理Web请求的过程,就是基于事件驱动模型的,它也包含事件收集器、事件发送器和事件处理器等三部分基本单元。Nginx的“事件收集器”和“事件发送器”的实现没有太大的特点,重点介绍一下它的“事件处理器”。
通常,我们在编写服务器处理模型的程序时,基于事件驱动模型,“目标对象”中的“事件处理器”可以有以下几种实现办法:

  • “事件发送器”每传递过来一个请求,“目标对象”就创建一个新的进程,调用“事件处理器”来处理该请求。
  • “事件发送器”每传递过来一个请求,“目标对象”就创建一个新的线程,调用“事件处理器”来处理该请求。
  • “事件发送器”每传递过来一个请求,“目标对象”就将其放入一个待处理事件的列表,使用非阻塞I/O方式调用“事件处理器”来处理该请求。

以上的三种处理方式,各有特点:

第一种方式,由于创建新的进程的开销比较大,会导致服务器性能比较差,但其实现相对来说比较简单。
第二种方式,由于要涉及到线程的同步,故可能会面临死锁、同步等一系列问题,编码比较复杂。
第三种方式,在编写程序代码时,逻辑比前面两种都复杂。大多数网络服务器采用了第三种方式,逐渐形成了所谓的“事件驱动处理库”。
事件驱动处理库又被称为多路IO复用方法,最常见的包括以下三种:select模型,poll模型和epoll模型。Nginx服务器还支持rtsig模型、kqueue模型、dev/poll模型和eventport模型等。通过Nginx配置可以使得Nginx服务器支持这几种事件驱动处理模型。

 

Nginx网络事件实例演示


1、TCP层:本地打开了53842,Nginx打开的是8080端口 进程与进程通信这件事情

2、IP层:本机IP地址:192.168.0.109 nginx服务器的IP地址:192.168.0.123(机器和机器之前怎么互相找到的问题)

 3、三次握手

  1. windows先向nginx发送一个SYN
  2. 相反的nginx所在的linux也会向windos发送一个SYN,这个时候nginx是没有感知到的、因为这是一个半打开的状态
  3. 直到widows再向nginx所在的linux服务器发送一个ACK时,linux操作系统才会通知nginx这时有一个读事件需要处理,这个读事件是建立新的连接。此时nginx调用accept方法去建立一个新的连接

 

上面就是通过抓包描述了三次握手是怎么引发一个读事件,以及根据这个读事件来建立连接的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值