nginx event loop默认启用且不可禁用,优化需协同配置(如multi_accept on、accept_mutex off)、内核参数(如somaxconn、tcp_tw_reuse)及系统资源(如nofile、max_user_watches)三方面调优。

Nginx 的 Event Loop 本身不可开关,它是 worker 进程内嵌的、基于 epoll(Linux)的事件驱动机制。优化高频率事件处理,关键不是“改 Loop”,而是让 Loop 跑得更稳、更快、更少卡顿——这需要从 Nginx 配置、内核参数、系统资源三者协同入手。
收紧连接生命周期,减少 Loop 负担
高频短请求下,空闲连接是最大隐性开销。它们占着 worker_connections 槽位,却无实际数据流动,拖慢新连接接入速度。
- 禁用 HTTP Keepalive:
keepalive_timeout 0;(写在 http 或 server 块),让连接响应后立即关闭,释放槽位
- 启用主动中断:
reset_timedout_connection on;,对握手失败或读写超时的连接直接发 RST,不等内核超时,避免积压
- 避免使用
rewrite ... redirect 做重定向;改用 return 301 或 return 302,跳过正则匹配和重写引擎,降低 Loop 内部处理开销
强化事件模型与进程调度
默认 epoll 已高效,但未调优时仍存在 accept 串行、软中断集中、CPU 切换频繁等问题。
匹配系统资源上限,防止 Loop 卡在系统层
Event Loop 再快,也会被文件描述符不足、epoll 监听项溢出、内核缓冲区卡住。
- 提升文件描述符限制:
在 /etc/security/limits.conf 中添加:
nginx soft nofile 1048576
nginx hard nofile 1048576
并在 nginx.conf 中设置:worker_rlimit_nofile 1048576;
- 扩大 epoll 监听容量:
fs.epoll.max_user_watches = 524288(写入 /etc/sysctl.conf 并执行 sysctl -p),避免高频建连/断连时 epoll_ctl() failed
- 调大内核网络缓冲:
net.core.rmem_max = 16777216、net.core.wmem_max = 16777216,配合 net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 动态区间,支撑突发流量不丢包
协同内核 TCP 状态回收,避免 Loop 等端口
Nginx 不管 TCP 状态机,但 TIME_WAIT 积压会直接导致端口耗尽,新连接 SYN 被丢弃,Loop 只能干等。
- 允许复用 TIME_WAIT 套接字:
net.ipv4.tcp_tw_reuse = 1(反向代理场景下尤其关键)
- 缩短 FIN_WAIT2 和 TIME_WAIT 等待时间:
net.ipv4.tcp_fin_timeout = 30
- 扩大全连接队列:
net.core.somaxconn = 65535,防 SYN 包丢失,确保 Loop 能及时拿到新连接
不复杂但容易忽略