要让nginx稳定支撑10万级并发,必须调优内核参数:文件描述符需≥1048576,somaxconn与tcp_max_syn_backlog设为65535,启用tcp_tw_reuse,扩展本地端口范围至1024–65535,并增大socket缓冲区及netdev_max_backlog。

要让 Nginx 在企业级场景下稳定支撑 10 万级并发,文件描述符与内核网络栈不是“可选项”,而是必须打通的底层通路。默认系统配置面向通用场景,无法承载高密度连接——不调优,Nginx 再多 worker、再大 connections 也卡在系统门槛上。
文件描述符:每个连接的“入场券”必须配足
每个 TCP 连接、每个打开的静态文件、每个 upstream socket 都消耗 1 个文件描述符(fd)。10 万并发至少需预留 1048576(1M)可用 fd,否则会出现 Too many open files 错误,连接直接被拒绝。
- 在 /etc/security/limits.conf 中为 Nginx 运行用户(如 nginx 或 www-data)设置:
nginx soft nofile 1048576
nginx hard nofile 1048576
* soft nofile 1048576
* hard nofile 1048576
- 若使用 systemd 启动,还需在 /etc/systemd/system/nginx.service 的 [Service] 段添加:
LimitNOFILE=1048576
- 重启服务后执行 ulimit -n,确认输出值 ≥ 1048576;同时检查 fs.file-max(系统级上限)是否设为 2097152 或更高
全连接队列与 SYN 队列:防止连接在内核门口就被丢弃
Nginx 的 listen ... backlog 参数只是“表面配置”,真正起作用的是内核的两个队列:SYN 队列(半连接)和全连接队列(已三次握手完成)。二者不匹配会导致请求静默丢包,表现为偶发 502、连接超时,日志却无异常。
- 在 /etc/sysctl.conf 中统一设为高水位:
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
- Nginx 配置中对应 listen 行必须显式声明:listen 80 backlog=65535;
- 验证方式:ss -lnt 查看 Recv-Q 是否长期接近或达到该值,若持续打满,说明上游流量已超出当前队列承载能力
TIME_WAIT 复用与端口池扩展:避免客户端资源枯竭
短连接密集型业务(如 API 网关、微服务调用)会产生大量 TIME_WAIT 状态 socket。默认行为下,这些 socket 占用端口且不可复用,极易触发 Cannot assign requested address 错误。
- 启用快速复用:net.ipv4.tcp_tw_reuse = 1(注意:tcp_tw_recycle 已废弃且在 NAT 环境下不安全,禁用)
- 扩大本地端口范围:net.ipv4.ip_local_port_range = 1024 65535,将可用临时端口从默认约 28K 扩至近 64K
- 缩短 FIN 超时:net.ipv4.tcp_fin_timeout = 30,加快 TIME_WAIT 状态释放节奏
缓冲区与接收队列:应对突发流量不丢包
当瞬时请求洪峰到来,内核收包缓冲区若过小,会直接丢弃数据包,引发重传、延迟升高甚至连接中断。
- 提升单 socket 缓冲区上限:net.core.rmem_max = 16777216(16MB)、net.core.wmem_max = 16777216
- 增大网卡接收队列深度:net.core.netdev_max_backlog = 50000,防止软中断来不及处理导致丢包
- 对高吞吐反向代理场景,建议启用 BBR 拥塞控制:net.ipv4.tcp_congestion_control = bbr(Linux 4.9+)











