news 2026/7/5 2:24:06

结合Nginx工作流程理解Epoll机制和Reactor模型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结合Nginx工作流程理解Epoll机制和Reactor模型

结合Nginx工作流程理解Epoll机制和Reactor模型

Nginx工作流程

启动准备:

  1. nginx启动,创建一个Master进程。
  2. Master进程解析配置文件,创建监听Socket。(一个ip和端口号一个监听Socket)
  3. Master进程创建Worker进程。
  4. 每个Worker进程在启动后创建自己的epoll实例来完成事件驱动。(Worker进程采用异步非阻塞的事件驱动模型Epoll来管理成千上万个请求)
  5. 同时将继承到的所有监听Socket的读事件注册到自己的epoll实例中。
  6. epoll实例监听到读事件之后通知Worker进程处理。

注意:为了避免惊群效应,现在的nginx采用的是锁机制或者SO_REUSEPORT机制,确保一个监听Socket只由有一个Worker线程负责。

惊群效应:当监听Socket有新的连接请求进来时,所有的Worker进程都会被唤醒,但最终只会有一个Worker线程拿到请求。

客户端连接请求:

客户端:
  1. 创建socket。(客户端调用socket()在内核创建一个socket。)
  2. 发送连接请求。(调用connect(),内核为该socket分配本地端口,并记录五元组,随后发送SYN包进行三次握手。)
  3. 建立连接后,客户端发送HTTP请求数据,内核将数据从用户缓冲区拷贝到内核socket写缓冲区中。
  4. 内核协议栈从写缓冲区取出数据,封装成TCP段,通过网卡发送到nginx所在服务器的网卡。
内核:
  1. HTTP请求数据包通过网络到达Nginx所在服务器网卡。
  2. 网卡将数据拷贝到内核的内存区域。
  3. 内核通过数据包的目标ip和端口,找到对应的监听socket。
  4. 由内核进行TCP连接的三次握手,建立连接。
  5. 连接完成后, 将请求放入到监听socket的全连接队列中。
  6. 此时,监听socket的“可读”事件被触发。
Worker进程:
连接请求:
  1. epoll监听到监听socket的可读事件后,同时通知worker进程。
  2. 当有空闲的worker进程时,worker进程调用accept系统调用,内核逐个获取监听socket的全连接队列中的连接,并创建新的socket返回给worker进程。
  3. Worker进程为新的socket在自己的内存空间分配一块内存。
  4. 并将新的socket的读事件注册到epoll实例中。
数据到达:
  1. 当新的socket有数据进来时epoll实例会通知Worker进程。
  2. Worker进程会通过内核,将内核Socket缓冲区的数据拷贝到用户空间。
  3. 接着在用户空间解析数据,判断数据是否完整
  4. 数据完整,通过配置文件找到后端服务器,与它建立连接。
  5. 建立连接后,将请求数据包从用户空间拷贝到与网卡关联的内核Socket缓冲区。
  6. 由网卡将缓冲区的数据发送到网络。
  7. 请求数据包通过网络到达后端服务器的网卡。

如果是HTTPS,解析前还需要经过SSL层的解密。

后端服务器:
  1. 后端服务器接收到请求数据后进行处理。
  2. 通过相同的方式将响应数据发送到nginx,nginx再发送给客户端。

结合Nginx看epoll机制:

Worker线程通过事件循环,主动调用一次epoll_wait方法,epoll_wait方法会去查询当前线程的epoll实例的就绪队列中,是否有等待处理的socket。
如果有,当前线程就直接去处理,没有的话当前进程就会进入睡眠状态,并将当前线程放到等待队列中。
(当网卡收到数据,内核将数据从网卡拷贝到内核缓冲区中后,通过解析数据的目标ip和端口号,找到对应的Socket(如果是没有创建连接的请求,则是监听socket;已经建立连接的,则是连接socket)。内核再去检查是哪个epoll实例在监听这个socket。找到之后,将这个socket加入到epoll实例的就绪队列中。)
直到epoll实例的就绪队列中有数据,内核就会唤醒等待队列中的进程,由进程去处理。
处理完就绪队列中的数据后,再次进入循环。

Reactor模型

Reactor模型实现异步非阻塞的事件驱动模型,也是同样的原理。
首先,Reactor在创建Epoll实例的时候,会告诉内核,我关心的是什么,比如,是接收请求(接收缓冲区有数据),还是发送请求(发送缓冲区有数据)。
然后让内核根据类型去判断,是否该发起通知了。
Reactor能做什么,取决于内核能通知什么,本质是对内核数据的判断。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 2:23:48

SRS 4.0 HTTP回调实战:SpringBoot 实现 7 种事件鉴权与业务集成

SRS 4.0 HTTP回调深度实践:SpringBoot构建企业级流媒体业务中枢1. 流媒体业务集成架构设计在实时音视频领域,SRS(Simple Realtime Server)作为高性能流媒体服务器,其HTTP回调机制是企业级集成的核心枢纽。不同于基础配…

作者头像 李华
网站建设 2026/7/5 2:23:12

iOS越狱完整指南:从新手到专家的安全解锁之旅

iOS越狱完整指南:从新手到专家的安全解锁之旅 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder 👇 项目地址: https:/…

作者头像 李华
网站建设 2026/7/5 2:22:50

引入测试驱动开发

由于本篇的依赖属性体系是基于测试驱动开发完成的,所以我们就先来看一下什么叫测试驱动开发:测试驱动开发的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试&…

作者头像 李华
网站建设 2026/7/5 2:21:10

NSK HA30AN超高刚度精密导轨技术详解

HA30AN 是 NSK(日本精工)HA系列滚珠直线导轨中的一款超高刚度型 / 高精度型的方形滑块型号。HA 系列是以滚珠导向、具有静压导向级别的高运动精度和高负载能力的旗舰级系列。 以下是基于技术手册提取的该型号详细参数规格、技术特点及产品应用&#xff1…

作者头像 李华
网站建设 2026/7/5 2:19:30

苏州本地GEO获客标杆!环境工程企业AI全域收录破5.2万条

随着豆包、文心一言、Kimi、DeepSeek等AI大模型成为工业采购、本地服务商搜索主流渠道,传统竞价推广成本高、流量泛化痛点凸显,一网推geo苏州本地服务中心依托总部自研AIGEO技术,为苏州格美环境工程有限公司打造定制化全域AI获客方案,交出可量化、高投产的真实运营成绩单,成为苏…

作者头像 李华
网站建设 2026/7/5 2:18:14

2026 XCPC 杂题选解

()()()()()()()()() ((((((((()))))))))所有括号序列,都只会出现在上面两者其一(除了 ())。 所以答案不会超过 2。问题变成检验答案是否为 1。这个问题不就是“是否存在一个字符串,不包含任意给定字符串”,经典的上 A…

作者头像 李华