直接调高worker_connections不能单独解决问题,它只是并发能力上限;必须同步调整系统级文件描述符限制、Nginx进程级worker_rlimit_nofile及内核net.core.somaxconn三者,否则将触发“Too many open files”或连接拒绝。

直接调高 worker_connections 不能单独解决问题,它只是并发能力的上限刻度。真正生效需要系统级限制、Nginx 进程级配置和内核参数三者同步调整,否则会报 Too many open files 或连接被拒绝。
先确认是不是真卡在这里
别一看到报错就改配置,很多情况是其他环节拖慢了连接释放:
- 用
ss -s或netstat -ant | grep ESTABLISHED | wc -l查当前活跃连接数,对比worker_processes × worker_connections理论值 - 查 Nginx 错误日志:
grep "worker_connections" /var/log/nginx/error.log,重点看有没有accept() failed (24: Too many open files) - 运行
ulimit -n,确认当前用户级文件描述符限制是否低于你打算设的worker_connections - 执行
cat /proc/sys/fs/file-max,确保系统级最大文件数远大于总连接需求(建议 ≥10 万)
必须同步改的三项配套设置
只改 worker_connections 是无效的,以下三项必须一起调:
- 系统级文件描述符限制:编辑
/etc/security/limits.conf,加入* soft nofile 65535* hard nofile 65535
并确认/etc/pam.d/common-session包含session required pam_limits.so,改完需重新登录或重载 PAM - Nginx 进程级限制:在
nginx.conf主上下文(http块外)添加worker_rlimit_nofile 65535;
该值应 ≥worker_connections,推荐设为相同数值 - 内核网络队列:修改
/etc/sysctl.conf,加入net.core.somaxconn = 65535net.core.netdev_max_backlog = 25000
然后执行sysctl -p生效
合理设置 worker_connections 数值
不是越大越好,要结合硬件资源和业务类型:
- 普通中型网站(日活 10 万以内):2048~4096 已足够
- API 服务或短连接高频场景:可设为 16384~65535,但必须确保
worker_rlimit_nofile和系统限制同步跟上 - 启用大量 keepalive(如超时设为 300s)时,每个长连接持续占一个槽位,需按真实并发连接峰值评估,而非 QPS
- 注意内存消耗:单个连接约占用 2–4KB,8GB 内存服务器不建议单 worker 超过 65535
改完记得验证和重启
修改后不要直接 reload 就完事:
- 先用
nginx -t检查配置语法是否正确 - 再执行
nginx -s reload(非restart,避免中断已有连接) - 观察错误日志几小时,确认不再出现
worker_connections are not enough或Too many open files - 压力测试验证:用
ab或wrk模拟并发连接,观察连接成功率与响应时间

















