解决Nginx高并发连接耗尽问题的关键是系统、内核、Nginx进程和业务四层资源对齐:需同步调优ulimit、net.core.somaxconn、worker_rlimit_nofile与worker_connections,并依短连/长连场景差异化配置keepalive、超时及上游复用策略。

解决 Nginx 高并发下的连接数耗尽问题,关键不是堆参数,而是让系统、进程、内核、Nginx 四层资源对齐,同时匹配业务连接特征——短连要快放,长连要稳持,上游要复用。
查清真实瓶颈在哪一层
连接耗尽常被误判为“Nginx 不够强”,实际可能卡在任意一层:
- 运行
cat /proc/$(pgrep nginx)/limits | grep "Max open files",看 Nginx worker 进程实际拿到的文件描述符上限。若显示 1024 或 4096,说明系统级限制没放开 - 执行
ss -s | grep "TCP:",重点关注estab(已建立)和synrecv(半连接等待)数量。若synrecv持续不为 0,说明内核 accept 队列已满(net.core.somaxconn不足) - 检查错误日志:
grep "worker_connections" /var/log/nginx/error.log,出现accept() failed (24: Too many open files)是系统级 fd 耗尽;出现worker_connections are not enough才是 Nginx 层配置不足
同步调齐三层文件描述符限制
每个连接至少占用 1 个文件描述符(fd),而 fd 受三重控制,缺一不可:
-
系统级:编辑
/etc/security/limits.conf,添加nginx soft nofile 65535nginx hard nofile 65535
(若用 systemd 启动,还需在/etc/systemd/system/nginx.service.d/override.conf中加LimitNOFILE=65535,再systemctl daemon-reload) -
Nginx 进程级:在
nginx.conf的 main 块(events 外、http 上方)添加worker_rlimit_nofile 65535;
该值必须 ≥worker_connections,建议设为相同值或略高(如 1.2 倍),为日志、临时文件留余量 -
内核连接队列:编辑
/etc/sysctl.conf,加入net.core.somaxconn = 65535net.core.netdev_max_backlog = 25000
执行sysctl -p生效。这个参数管的是“还没进 Nginx 的排队区”,不调大会丢 SYN 包
优化连接生命周期与复用策略
连接不是越多越好,而是越轻、越久、越准越好:
-
短连接场景(如移动端 API、压测):
设keepalive_timeout 0;彻底禁用长连接;
收紧客户端超时:client_header_timeout 10s; client_body_timeout 10s; send_timeout 10s;,防慢速攻击 -
长连接场景(如 WebSocket、HTTP/2、静态资源):
设keepalive_timeout 30s;和keepalive_requests 1000;,避免空闲连接长期占位;
启用内核 TIME_WAIT 复用:net.ipv4.tcp_tw_reuse = 1(需同时开启net.ipv4.tcp_timestamps = 1) -
上游连接池(反向代理时):
在upstream块中配置:keepalive 300;(连接池大小)、keepalive_timeout 60s;、keepalive_requests 10000;,避免每请求重建后端 TCP 连接
启用高效事件模型与调度机制
让单个 worker 更快、更稳地处理连接:
- 显式声明
events { use epoll; multi_accept on; }——multi_accept on让一次事件循环尽可能多地从内核队列中取连接,减少排队积压 -
worker_processes auto;+worker_cpu_affinity auto;(Linux 4.0+),或手动绑定(如 8 核配00000001 00000010 ...),避免跨核调度带来的缓存失效 - 合理设置
worker_connections:普通网站 4096~8192;高频短连 16384~32768;长连场景 8192~16384。注意每个连接约消耗 232–248 字节内存,过大易引发 OOM


















