worker_connections与net.core.somaxconn构成连接接纳链的前后两关:前者限每个worker已建立连接数,后者控内核SYN队列长度;二者需协同调优,否则引发丢连、502/503及压测失真。

worker_connections 和 net.core.somaxconn 看似独立,实则构成连接接纳链的“前后两关”:前者决定每个 worker 能处理多少已建立的连接,后者控制内核监听队列能暂存多少待完成三次握手的 SYN 请求。配不匹配,轻则丢连接、重则压测失真、线上偶发 502/503。
worker_connections 不是孤立配置值
它必须落在系统实际允许的范围内,否则 Nginx 启动时会静默降级或报错。关键约束有三层:
- 单进程文件描述符上限(ulimit -n):worker_connections 必须 ≤ ulimit -n;建议设为 ulimit -n 的 70%~80%,预留空间给日志句柄、上游连接、临时文件等;
-
worker_rlimit_nofile 设置:Nginx 配置中需显式声明
worker_rlimit_nofile 100000;,且该值 ≥ worker_connections,否则配置不生效; -
总并发能力公式:理论最大并发 =
worker_processes × worker_connections,但真实可用值受 net.core.somaxconn 和应用层行为共同制约。
net.core.somaxconn 是连接入口的“第一道闸门”
它定义了内核为每个监听 socket 维护的已完成三次握手(ESTABLISHED)连接队列长度。若该值太小,高并发突增时新连接 SYN 包会被直接丢弃,客户端表现为超时或 Connection refused。
- 默认值通常仅 128 或 1024,远低于现代 Web 服务需求;
- 建议统一设为
65535(或至少 32768),写入/etc/sysctl.conf并执行sysctl -p生效; - 需同步调高
net.ipv4.tcp_max_syn_backlog(SYN 半连接队列),避免半开连接堆积导致 SYN Flood 类似表现。
二者协同验证与调优闭环
光改配置没用,得看真实连接状态是否健康:
- 用
ss -s观察total:和tcp:行中的inuse、orphans、tw(TIME-WAIT)数量,若inuse长期逼近 somaxconn 值,说明入口队列吃紧; - 启用 Nginx
stub_status模块,访问/nginx_status查看Active connections峰值是否稳定在worker_processes × worker_connections的 70%~90%,过高可能资源耗尽,过低说明上游或业务逻辑成为瓶颈; - 压测时关注
ss -i输出中的retrans(重传)和qdisc drops,若明显升高,大概率是 somaxconn 或网卡队列溢出所致。
配套必须做的系统级准备
脱离系统环境谈 Nginx 参数就是纸上谈兵:
- 在
/etc/security/limits.conf中为 nginx 用户设置:
nginx soft nofile 1000000
nginx hard nofile 1000000 - 确认 systemd 未覆盖 limits:检查
/etc/systemd/system/nginx.service.d/override.conf是否含LimitNOFILE=1000000; - 搭配
multi_accept on;和accept_mutex off;,让所有 worker 同时抢新连接,才能真正把 somaxconn 队列里的连接快速分发出去。


















