调优Nginx并发连接限制需内核参数、系统级限制与Nginx配置三者联动:设ulimit -n 1000000并配limits.conf和systemd override;调大net.core.somaxconn等TCP队列;nginx.conf中worker_rlimit_nofile、worker_connections、use epoll须严格匹配,且通过/proc/PID/limits验证生效。

调优 Nginx 并发连接限制,不能只改 nginx.conf 里的几个参数。真正卡住高并发的,往往是操作系统底层的资源限制。必须从内核参数、系统级限制、Nginx 配置三者联动入手,缺一不可。
系统文件描述符限制(ulimit)
这是最常被忽略的第一道关卡。Nginx 每个连接都要占用一个文件描述符(fd),而默认 Linux 用户最多只能打开 1024 个 fd。
- 临时生效:运行
ulimit -n 1000000(建议设为 100 万,留足余量) - 永久生效:编辑
/etc/security/limits.conf,追加两行:* soft nofile 1000000* hard nofile 1000000 - 注意:该设置对 systemd 启动的服务可能不生效,需额外配置
/etc/systemd/system/nginx.service.d/override.conf,加入LimitNOFILE=1000000
内核网络队列与连接参数
当瞬时连接洪峰到来时,内核的 TCP 连接队列若太小,新连接会被直接丢弃,表现为 502/503 或连接超时。
-
net.core.somaxconn:监听队列最大长度,默认 128。电商大促场景建议调至 32768 -
net.ipv4.tcp_max_syn_backlog:SYN 半连接队列上限,应 ≥somaxconn,推荐 16384 -
net.ipv4.ip_local_port_range:本地端口范围,影响反向代理时的可用 outbound 端口数。设为 "1024 65535" 可释放更多端口 - 执行命令生效:
sysctl -w net.core.somaxconn=32768,并写入/etc/sysctl.conf持久化
Nginx 配置层关键联动参数
这些参数必须和上面两项严格匹配,否则配置无效或引发异常。
-
worker_rlimit_nofile 1000000;:让每个 worker 进程能打开的 fd 数 ≥ ulimit 值,且 ≥worker_connections -
events { worker_connections 65535; use epoll; multi_accept on; }:Linux 必须用epoll;multi_accept on允许单次 accept 多个连接,减少唤醒延迟 - 验证是否生效:启动后执行
cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",确认 Max open files 显示值 ≥ 1000000
连接复用与内存水位控制
单纯堆高连接数不解决实际问题,还要防止短连接风暴耗尽资源。
-
keepalive_timeout 60;:长连接保持时间不宜过长(如 >120s),否则空闲连接堆积占用 fd 和内存 -
keepalive_requests 1000;:单连接处理请求数上限,防内存泄漏,尤其在启用 gzip 或 proxy_buffer 时 -
client_body_timeout 12;、client_header_timeout 12;:及时中断慢速客户端,释放连接资源 - 每连接内存开销约 240 字节,10 万连接 ≈ 24MB 内存,务必结合服务器总内存合理设定上限


















