要让Nginx稳定支持十万并发,必须调优Linux内核参数:扩大文件描述符限制(nofile≥1048576)、调整somaxconn与tcp_max_syn_backlog至65535、启用tcp_tw_reuse、扩展本地端口范围,并协同优化socket缓冲区及Nginx网络选项。

要让 Nginx 稳定突破十万并发,光调配置远远不够——内核参数是底层支撑,没它,Nginx 再怎么配都是“在沙地上盖楼”。真正卡住十万并发的,往往是系统级限制:文件描述符不够、连接队列溢出、TIME_WAIT 堆积、端口耗尽。这些必须从 Linux 内核层解开。
系统资源限制必须先放开
Nginx 的每个连接至少占用 1 个文件描述符(fd),10 万并发意味着至少需要 10 万+ 的可用 fd。默认系统通常只开放 1024,不改就直接触发 Too many open files 错误。
-
编辑
/etc/security/limits.conf,为 Nginx 启动用户(如www-data或nginx)设上限: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-
修改
/etc/sysctl.conf,调整关键网络参数:fs.file-max = 2097152 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 50000 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_fin_timeout = 30
运行 sysctl -p 生效后,重点验证:
-
somaxconn必须 ≥ Nginxlisten指令的backlog值(如listen 80 backlog=65535;) -
tcp_tw_reuse = 1允许 TIME_WAIT socket 被快速复用于新连接,对短连接密集型业务(如 API 网关)至关重要 -
ip_local_port_range扩展了客户端可用端口池,避免Cannot assign requested address错误
连接建立链路要全程打通
从客户端 SYN 到 Nginx accept,中间有三层队列:
- 网络协议栈的 SYN 队列(由
tcp_max_syn_backlog控制) - 内核全连接队列(由
somaxconn控制) - Nginx worker 的事件队列(由
worker_connections和multi_accept on影响)
三者必须对齐。例如:若 somaxconn = 1024,但 Nginx 设了 backlog=65535,超出部分请求会直接被内核丢弃,表现为偶发 502 或连接超时,日志却无错误。
内存与缓冲行为需协同收敛
高并发下,内核 socket 缓冲区(rmem_default, wmem_default)若过小,会导致 TCP 包频繁重传;若过大,则浪费内存并加剧延迟。建议设为合理中值:
net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216
配合 Nginx 的 tcp_nodelay on 和 tcp_nopush on,可减少小包粘包、提升响应及时性,尤其适合微服务间高频低延迟调用。
不复杂但容易忽略



















