要让Nginx真正撑住高并发,必须协同优化内核TCP栈与Nginx配置:net.core.somaxconn需设为65535或更高(如262144),nginx listen backlog须与之对齐;keepalive_timeout建议60s、keepalive_requests设为10000以平衡复用与资源;同时调大tcp_max_syn_backlog、确保ulimit -n≥65535并配worker_rlimit_nofile,启用epoll和multi_accept。

要让 Nginx 真正撑住高并发,光调 nginx.conf 不够,必须打通内核 TCP 栈——关键就在 somaxconn、backlog 和 keepalive 这三层的协同。
net.core.somaxconn 决定系统级连接队列上限
这个参数控制内核为每个监听 socket 维护的“已完成连接”队列最大长度。默认值 128 在高并发下极易溢出,导致新连接被丢弃(SYN 收到但不回复 ACK),表现为客户端超时或 connection refused。
- 建议设为 65535 或更高,尤其在 16G+ 内存机器上可设为 262144
- 修改方式:echo 65535 > /proc/sys/net/core/somaxconn,并写入 /etc/sysctl.conf 持久化
- 注意:Nginx 的 listen backlog 值不能超过它,否则会被自动截断
nginx listen backlog 参数要与 somaxconn 对齐
Nginx 的 listen 80 backlog=1024; 中的 backlog 并非独立生效,它最终受限于内核的 somaxconn。若 somaxconn=128,哪怕你写 backlog=8192,实际队列仍只有 128。
- 推荐显式配置,例如:listen 80 backlog=65535;
- Kubernetes Ingress NGINX Controller 会自动读取 somaxconn 值作为默认 backlog,但仍建议手动确认其生效
- 对于自建 Nginx,需同时改内核参数 + nginx 配置,缺一不可
keepalive_timeout 与 keepalive_requests 要平衡复用与资源占用
长连接能显著降低握手开销,但过长的 keepalive 会滞留大量空闲连接,挤占 worker_connections 资源。
- keepalive_timeout 60; 是主流选择:60 秒无新请求即关闭,兼顾复用率与连接释放速度
- keepalive_requests 10000; 控制单连接最多处理请求数,防止单连接长期霸占资源
- 若业务多为短平快接口(如 API),可适当缩短 timeout 至 15–30 秒;若含大文件下载,需结合 send_timeout 协同调整
别漏掉配套参数:tcp_max_syn_backlog 和 ulimit
somaxconn 只管“已完成连接”,而“待完成连接”(SYN 队列)由 net.ipv4.tcp_max_syn_backlog 控制,它同样需要调大(建议 ≥65535)。另外:
- 确保 ulimit -n ≥ 65535,并通过 worker_rlimit_nofile 同步给 Nginx 进程
- worker_connections × worker_processes 应 ≤ ulimit -n,否则会出现 “too many open files” 错误
- 使用 use epoll; 和 multi_accept on; 可进一步提升连接接纳效率











