Nginx异步事件驱动架构的核心是单worker进程通过非阻塞I/O、epoll/kqueue事件通知和状态机调度,实现对数万连接的高效管理:不等待、不阻塞、无上下文切换,所有操作仅在事件就绪时触发。

Nginx 的异步事件驱动架构不是靠“多线程堆资源”来通信,而是让单个 worker 进程用极轻量的方式调度成千上万个连接,所有通信动作都围绕“事件就绪即处理、不等不卡不切换”展开。
事件循环统一监听,避免轮询和阻塞
每个 worker 进程启动后进入一个紧凑的事件循环,不主动 sleep,也不遍历所有 socket。它调用 epoll_wait(Linux)或 kqueue(BSD/macOS)这类系统调用,把监听权交给内核——内核只在有连接真正可读、可写或出错时才通知 Nginx。这样既省 CPU,又免去了传统 select/poll 每次都要拷贝整个 fd 集合的开销。
- 新连接到达时,accept() 尽可能一次收多个,减少事件触发次数
- 收到请求数据后,立即解析 HTTP 头,不等完整 body 到达就准备转发
- 响应写入时若内核缓冲区满,只发能发的部分,然后注册 write 事件,等下次可写再续
全程非阻塞 I/O,连接生命周期无等待
从 accept 开始,每个 socket 都设为 non-blocking 模式。这意味着任何 I/O 操作(recv/send)都不会让 worker 停下来干等。如果没数据可读,立刻返回 EAGAIN;如果发不完,也立刻返回,剩余数据暂存在连接自己的 output buffer 中。
- 读操作遇到 EAGAIN,就转去处理其他就绪连接
- 写操作未完成,自动挂起并等待下一次 write event 触发
- 超时控制由红黑树统一管理,每个连接的 keepalive timeout、read timeout 都是事件系统的一部分,无需额外线程轮询
零拷贝与内存复用降低通信成本
高效通信不仅靠调度快,还得减少数据搬运。Nginx 在关键路径上绕过用户态内存拷贝:
- 静态文件响应启用 sendfile(),让内核直接从磁盘读取、经 TCP 发送,不经过 Nginx 用户空间
- 动态响应使用 slab 内存池分配 request/response buffer,避免频繁 malloc/free 和内存碎片
- 配合 tcp_nopush(合并包)和 tcp_nodelay(禁用 Nagle),按需平衡延迟与吞吐
模块解耦 + 配置驱动,让通信策略可调可控
事件循环只负责分发事件,具体怎么解析、怎么选 upstream、怎么缓存,全由对应模块的回调函数执行。这种分离让功能扩展不影响调度效率,也支持精细化配置:
- worker_connections 控制单 worker 最大连接数,需匹配 ulimit -n
- multi_accept on 可提升突发流量下 accept 效率
- proxy_buffering on 能缓冲慢上游响应,避免阻塞客户端连接
- upstream 中启用 keepalive 和 health_check,实现与后端的异步健康探测和连接复用
不复杂但容易忽略。



















