Nginx 的异步事件驱动是流量处理的底层节拍器,依托 epoll 实现单 worker 并发万级连接,通过零阻塞 I/O 编排、异步上游交互与合理配置保障高性能。

Nginx 的异步事件驱动不是“加速器”,而是整套流量处理的底层节拍器——它让每个请求在连接建立、头解析、后端转发、响应接收等环节都变成可调度的独立事件,全程不阻塞、不空转、不浪费 CPU。
单 worker 轮询万级连接,靠的是 epoll 就绪通知
Linux 下 Nginx 默认用 epoll,一个 worker 进程就能同时监听成千上万个 socket。客户端发来请求时,内核把该 socket 标记为“可读”,epoll_wait 一返回就立刻处理,不用像 select 那样挨个扫描所有 fd。TCP 握手、HTTP 头解析、后端响应到达……每个动作都注册为事件,触发即执行,没就绪就跳过,CPU 始终有事干。
- worker_processes 设为 CPU 核心数,避免进程争抢事件队列
- 显式写 use epoll,省掉自动探测开销
- multi_accept on,一次收多个就绪连接,减少事件循环空转
转发不卡顿,关键在零阻塞 I/O 编排
反向代理最怕“等”:等后端响应、等磁盘读缓存、等 SSL 握手完成。Nginx 把这些全拆成异步任务:
- 大文件响应走 sendfile(),数据从磁盘直接送网卡,不进用户态内存
- 动态响应用 slab 内存池管理 buffer,避免 malloc/free 拖慢事件处理
- proxy_buffering on + 合理设置 proxy_buffers,把后端慢响应先缓起来,不堵住 worker
- SSL 卸载在用户态闭环完成,不触发阻塞系统调用
上游交互也异步,连接复用+健康探测不拖慢主流程
和后端服务器打交道同样走事件流:
- upstream keepalive 指令开启连接池,复用 TCP 连接,省去三次握手和慢启动
- health_check 异步发起,不影响正在处理的请求
- proxy_next_upstream timeout error http_502 等配置搭配 tries 和 timeout,故障切换在毫秒级完成,不堆积事件
- least_conn 或一致性哈希负载策略,降低后端负载抖动对事件节奏的影响
配置不当,异步优势就打折扣
再好的架构也怕错配:
- worker_connections 超过 ulimit -n,新连接直接被拒
- proxy_set_header 里用 $request_time 等变量做复杂计算,会把事件处理拉回同步路径
- proxy_buffer_size 设太小,频繁触发 buffer 扩容,打断流水线
- 没开 TCP_NODELAY 或 TCP_NOPUSH,小包延迟或合并不当,影响首字节时间



















