worker_connections必须与系统文件句柄限制协同调优,核心是确保/proc/sys/fs/file-max、ulimit -n(nginx用户)、worker_rlimit_nofile三者对齐,且最小值决定实际并发上限;短连接场景建议设16384~65535并启用tcp_tw_reuse,长连接或HTTPS代理需预留更多fd余量,压测时须用lsof和ss验证实效。

worker_connections 不是孤立可调的数字,它直接绑定系统级文件句柄(fd)资源。在高并发代理场景(如 Nginx 代理 Netty 数据采集服务、API 网关、长连接上报等)中,每个客户端连接、上游连接、keepalive 连接、日志写入、SSL 缓存都会占用 fd。若不协同调优,很快触发 “Too many open files”,新连接被内核丢弃,表现为 accept() failed (24) 错误。
明确各层句柄限制关系
真正起作用的是三层限制的最小值,必须逐层对齐:
- 系统级总上限:/proc/sys/fs/file-max,决定整机所有进程能打开的 fd 总数;建议设为 worker_processes × worker_connections × 1.3~1.5,预留 TIME_WAIT、日志、临时缓存等开销
- 用户/进程级上限:ulimit -n(soft/hard),Nginx worker 进程启动时继承该值;需在 /etc/security/limits.conf 中为 nginx 用户(如 www-data)显式配置 soft 和 hard nofile 至相同值(如 65536)
- Nginx 进程级声明:worker_rlimit_nofile 必须在 nginx.conf 主上下文设置,且 ≥ worker_connections;它主动调用 setrlimit(),避免依赖环境 ulimit 的不确定性
合理设定 worker_connections 数值
不能只看理论并发数(worker_processes × worker_connections),要结合代理行为特征估算实际 fd 消耗:
- 短连接密集型(如每秒数千次上报):每个请求新建连接 + 关闭,fd 高频分配释放,需更高 buffer;建议 worker_connections 设为 16384~65535,并配 net.ipv4.tcp_tw_reuse = 1
- 长连接保活型(如 MQTT/HTTP/2 上报通道):单连接持续复用,fd 占用稳定但总量大;worker_connections 可设 32768~65535,重点保障 worker_rlimit_nofile 和 file-max 充足
- 代理 HTTPS 流量:除 socket 外,还需 SSL session cache、OCSP stapling、证书文件等额外 fd;建议 worker_connections 不超过单进程 ulimit 的 80%
减少非必要 fd 占用
即使上限调高,冗余 fd 仍会加速耗尽:
- 关闭未启用的日志:注释 access_log 或改用 buffer+flush,避免每个请求写一次磁盘 fd
- 优化 upstream keepalive:在 upstream 块中启用 keepalive 并设合理池大小(如 keepalive 32;),避免频繁建连断连
- 禁用不必要的模块:如未用 gzip_static、realip、geoip 等,减少对应配置文件、缓存结构的 fd 开销
- 检查第三方模块:某些 Lua 脚本或动态模块可能泄漏 fd,压测后用 lsof -p $(pgrep nginx) | wc -l 对比连接数与 fd 数
验证是否真正生效
配置完成后,不能只看 nginx -t,要确认运行时限制已落地:
- 查系统总上限:
cat /proc/sys/fs/file-max - 查某 worker 进程实际限制:
cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files" - 查当前打开 fd 总数:
lsof -p $(pgrep nginx) | wc -l,对比 worker_connections × worker_processes × 1.2 是否留有余量 - 压测时监控:
ss -s查 ESTAB/TIME-WAIT 数量,netstat -s | grep -i "listen overflows"确认未发生 listen 队列溢出

















