nginx高并发稳定需系统性调优:accept队列(somaxconn与backlog对齐)、syn半连接队列(tcp_max_syn_backlog+syncookies)、keepalive连接(timeout与requests平衡),并配套ulimit、netdev_max_backlog、multi_accept等内核参数协同优化。

要让 Nginx 在高并发场景下真正稳住连接、不丢请求、不超时,必须打通应用层和内核层的 TCP 栈——这不是只改 nginx.conf 就能解决的事,而是三类队列、四组参数、两层协同的系统性调优。
accept 队列:net.core.somaxconn + listen backlog 必须对齐
这是最常被忽略的瓶颈点。内核用 net.core.somaxconn 控制每个监听端口“已完成三次握手、等待 Nginx accept()”的连接上限。默认 128,在千级并发下就会溢出,客户端看到的是 Connection refused 或 SYN 超时。
- 生产建议值:65535(16G+ 内存可设为 262144)
- 写入
/etc/sysctl.conf持久化:net.core.somaxconn = 65535 - Nginx 配置中必须显式匹配:
listen 80 reuseport backlog=65535; - 若未写
backlog=,Nginx 默认用 511,远低于内核上限,等于白调
SYN 半连接队列:tcp_max_syn_backlog 防突发压垮
它管的是“收到 SYN、但还没完成三次握手”的连接暂存区。在秒级建连高峰或遭遇轻量 SYN Flood 时,这个队列满会导致合法请求直接被丢弃,且无日志可查。
- 建议值 ≥65535,与
somaxconn同级配置 - 搭配启用
net.ipv4.tcp_syncookies = 1,队列满时自动启用 Cookie 验证,避免硬丢包 - 注意:该参数不影响 Nginx 行为本身,但它决定连接能否顺利走到 accept 队列
keepalive 连接:timeout 与 requests 要动态平衡
长连接能省握手开销,但放任不管会挤占 worker_connections,导致新连接无法接入。
-
keepalive_timeout 60;是通用推荐:60 秒无新请求即释放,兼顾复用率与资源周转 -
keepalive_requests 10000;防止单连接长期霸占 worker,尤其适合 API 类短请求 - 若服务含大文件下载,需同步调大
send_timeout,避免传输中途被断连
配套资源链路:ulimit、netdev_max_backlog、multi_accept 缺一不可
光调队列参数,不打通底层资源,等于修水管却不通水压。
-
ulimit -n必须 ≥65535,并在 nginx.conf 中配worker_rlimit_nofile 65535; -
net.core.netdev_max_backlog建议设为 16384–100000,防网卡收包过快、CPU 来不及处理而丢包 -
multi_accept on;让单个事件循环尽可能多地 accept 连接,配合reuseport效果更佳 - 确认启用
use epoll;,并关闭accept_mutex(高并发下它反而成瓶颈)











