Nginx高效并发依赖单worker进程+异步非阻塞事件驱动机制,底层由epoll多路复用支撑,配合零拷贝、连接池、红黑树等优化实现高吞吐低延迟。

Nginx 实现高效并发请求处理,核心在于它用单个 worker 进程管理成千上万个连接,不靠堆线程或进程,而是靠异步、非阻塞、事件驱动这一整套协同机制。它不是“更快地执行每个请求”,而是“不让任何一个请求卡住其他请求”。
epoll 多路复用是事件调度的底层支撑
在 Linux 系统中,Nginx 默认(也推荐)使用 epoll 作为 I/O 多路复用机制。它让一个 worker 进程能同时监听大量 socket 的状态变化——比如哪个连接有数据可读、哪个缓冲区已空可写、哪个连接异常断开。epoll_wait() 调用本身几乎不耗 CPU,内核只在真正有事件时才通知 Nginx,时间复杂度接近 O(1),远优于传统轮询或 select/poll。
- 配置中显式写 use epoll; 可确保启用(虽多数新版默认已选)
- 每个新连接 accept 后,立即被注册进 epoll 监听集,并设为 non-blocking 模式
- 连接关闭时,自动从 epoll 中移除,避免无效监听
事件循环驱动整个请求生命周期
每个 worker 进程运行一个紧凑的事件循环:调用 epoll_wait 等待就绪事件 → 获取一批就绪 fd → 遍历并分发给对应 handler(如 ngx_http_wait_request_handler)→ 处理完立即返回循环,不等待任何 I/O 完成。
- 读请求头、收请求体、发响应、转发 upstream,全部拆解为小步状态机操作
- recv() 返回 EAGAIN 时,不阻塞,直接处理下一个就绪事件;数据来了再继续该连接
- send() 发不完的数据,留在连接的 output buffer,等 write event 触发再续发
非阻塞 I/O + 内存与内核协同优化
光靠事件通知还不够,Nginx 还通过减少系统调用和内存拷贝,把每次事件处理的开销压到最低:
- 静态文件用 sendfile on;,让内核直接在 page cache 和 socket buffer 间传输,零用户态拷贝
- 开启 tcp_nopush on; 和 tcp_nodelay on;,平衡包合并与实时性
- 文件元信息缓存(open_file_cache)、连接超时用红黑树管理,避免轮询或额外线程
- 内存分配走 slab + 连接池复用,避免频繁 malloc/free
配置不当会悄悄破坏异步优势
很多性能问题并非模型不行,而是某些配置引入了隐式同步阻塞:
- proxy_buffering off; 且上游响应慢 → Nginx 被迫轮询等待,退化为忙等
- auth_request 指向另一个 HTTP 接口 → 默认同步等待,应改用本地 JWT 校验或缓存结果
- 未启用 ssl_session_cache shared:SSL:10m; → 每次 TLS 握手都耗几十毫秒
- log_format 中含 $upstream_response_time 且磁盘慢 → 日志写入虽异步,但高负载下可能拖慢 worker 调度



















