worker_connections必须与系统ulimit、worker_rlimit_nofile、net.core.somaxconn及epoll等events参数协同配置,否则设再高也无效,易触发“too many open files”或连接丢弃。

worker_connections 不是随便调大的数字,它必须和系统资源、内核参数、Nginx 自身事件模型协同工作,否则设再高也无效,甚至引发连接丢弃、502/503 或压测失真。
worker_connections 与系统文件描述符限制(ulimit)必须对齐
每个连接至少占用 1 个文件描述符(fd),Nginx worker 进程还额外需要 fd 处理日志、上游连接、临时文件等。若 ulimit -n 仅 1024,却配置 worker_connections 8192,实际生效值就是 1024,且可能报 “too many open files” 错误。
- 临时生效:启动前执行 ulimit -n 65536(需对应权限)
- 永久生效:在 /etc/security/limits.conf 中添加(替换 nginx 为实际运行用户,如 www-data):
nginx soft nofile 65536
nginx hard nofile 65536 - 验证方式:运行 ulimit -n 查当前会话;或用 cat /proc/$(pgrep nginx)/limits | grep "Max open files" 查已运行 worker 进程的实际限制
worker_rlimit_nofile 是 Nginx 内部的“保险阀”
即使系统 ulimit 调高了,Nginx 仍需显式声明能使用的 fd 上限,否则 worker_connections 配置不会真正生效。
- 在 nginx.conf 的 main 块中设置:worker_rlimit_nofile 65536;
- 该值必须 ≥ worker_processes × worker_connections,建议留出 10%~20% 余量
- 若未配置或设得太小,Nginx 启动时可能静默降级,不报错但性能受限
net.core.somaxconn 是连接入口的第一道闸门
它控制内核监听 socket 的已完成三次握手(ESTABLISHED)连接队列长度。若太小,客户端 SYN 包会被直接丢弃,表现为 Connection refused 或超时。
- 默认值通常为 128 或 1024,远不满足现代服务需求
- 建议统一设为 65535,写入 /etc/sysctl.conf 并执行 sysctl -p 生效
- 同步调高 net.ipv4.tcp_max_syn_backlog(半连接队列),避免 SYN Flood 类表现
- 验证方法:用 ss -s 观察 tcp 行中的 inuse 值,若长期逼近 somaxconn,说明入口队列吃紧
配套 events 参数才能释放并发潜力
只改 worker_connections 不够,还需匹配事件模型与连接接收策略:
- use epoll;:Linux 下必须显式指定,避免回退到 select/poll 的 1024 硬限制
- multi_accept on;:让一个 worker 在一次事件循环中尽可能多地 accept 新连接,缓解突发流量排队
- accept_mutex on;:防止多个 worker 同时争抢新连接导致“惊群”,与 multi_accept 协同工作
- 理论最大并发 = worker_processes × worker_connections,但真实可用值受上述所有环节共同制约











