worker_connections 与 net.core.somaxconn 需协同调优:前者限每个 worker 已建立连接数,后者控内核 SYN 队列长度;不匹配会导致丢连、502/503 及压测失真,且必须与 ulimit -n、worker_rlimit_nofile 对齐。

压测工具吞吐量上不去,如果排查确认不是客户端瓶颈、网络带宽或后端服务拖慢,那很可能是 Nginx 层的 worker_connections 配置过小,导致连接被拒绝或排队堆积。这不是“调大就行”的简单操作,而是一整套系统级对齐动作。
先验证是否真是 worker_connections 瓶颈
别急着改配置,先用这几条命令快速定位:
-
ss -s | grep "TCP:"—— 查看当前 ESTABLISHED 连接总数,接近worker_processes × worker_connections就高度可疑 -
netstat -s | grep "connection refused"或ss -lnt | grep :80看监听端口的 Recv-Q 是否持续接近net.core.somaxconn值(如长期卡在 4096) - 压测时执行
curl -I http://your-nginx/health,若偶发502 Bad Gateway或503 Service Temporarily Unavailable,且 Nginx error.log 出现"accept() failed (24: Too many open files)",基本坐实
worker_connections 必须和 ulimit 对齐
这个值再大也白搭,如果系统没给够文件描述符(fd):
- 临时生效:
ulimit -n 65536(需在启动 Nginx 前执行,且用户有权限) - 永久生效:编辑
/etc/security/limits.conf,加两行(把nginx换成实际运行用户,如www-data):
nginx soft nofile 65536
nginx hard nofile 65536 - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确保 Soft Limit 和 Hard Limit 都 ≥ 你打算设的worker_connections
合理设置 worker_connections 和配套参数
不是堆数字,而是让整个连接链路畅通:
-
worker_connections建议设为 ulimit -n 的 70%~80%,比如 ulimit 是 65536,就设50000;避免设满,要预留 fd 给日志、上游连接、临时文件等 - 在
events块中必须显式写:
use epoll;
multi_accept on;
accept_mutex on; - 加一行
worker_rlimit_nofile 65536;(值 ≥worker_processes × worker_connections),让 Nginx 主进程主动申请足够 fd
别漏掉内核层的协同配置
worker_connections 控的是“已建立连接”,但连接进来前,得先过内核的“排队关”:
- 检查:
cat /proc/sys/net/core/somaxconn,默认常是 128 或 1024,远远不够 - 临时调高:
sysctl -w net.core.somaxconn=4096 - 永久生效:在
/etc/sysctl.conf加一行 net.core.somaxconn = 4096,然后sysctl -p - 确保
net.core.somaxconn ≥ worker_connections(至少同量级),否则新连接在进 Nginx 前就被内核丢弃


















