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方法去建立一个新的连接

 

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

### NGINX 事件驱动模型工作原理 NGINX采用了一种高效的事件驱动架构来管理网络请求和服务响应。通过该模型,服务器能够在保持较低资源占用的同时处理大量的并发连接[^1]。 #### 多路复用机制 为了实现高效率的I/O操作,NGINX依赖于操作系统提供的多路复用接口(如epoll, kqueue)。这些接口允许单线程监听多个文件描述符上的读写就绪状态变化,从而避免了传统阻塞模式下频繁创建销毁线程所带来的开销。当某个连接有数据可读或准备发送时,相应的回调函数会被触发执行特定的任务,比如接收客户端发来的HTTP请求并作出回应[^2]。 #### 非阻塞异步IO 除了利用底层系统的特性外,NGINX内部也实现了非阻塞式的输入输出方式。这意味着对于每一个具体的任务来说,在等待某些外部条件满足期间不会造成整个进程停滞不前;相反地会继续去检查其他已经准备好被处理的数据流。一旦所需的信息变得可用,则立即着手对其进行加工转换直至完成最终目标——即返回给用户所期望的结果页面或其他形式的内容体。 ```python import asyncio async def handle_request(reader, writer): data = await reader.read(100) message = data.decode() addr = writer.get_extra_info('peername') print(f"Received {message} from {addr}") response = f"Echo: {message}" writer.write(response.encode()) await writer.drain() writer.close() await writer.wait_closed() async def main(): server = await asyncio.start_server( handle_request, '127.0.0.1', 8888) async with server: await server.serve_forever() # Run the event loop asyncio.run(main()) ``` 此Python代码片段展示了如何使用`asyncio`库构建一个简单的TCP回声服务端程序,它模拟了类似于NGINX中使用的非阻塞异步I/O行为。请注意这只是一个简化版的例子用于说明概念,并不是实际部署生产环境的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值