worker_connections上限必须≤系统允许的单进程文件描述符数(ulimit -n)并预留10%余量,同时需与worker_processes、worker_rlimit_nofile及内核file-max协同配置,否则将触发“too many open files”错误。

worker_connections 的配置上限不是随便填个大数字就行,它必须落在系统能真正支撑的范围内,否则 Nginx 启动失败或运行中报 “too many open files”。核心原则是:**单个 worker 进程能设的最大值,不能超过该进程被允许打开的文件描述符数(ulimit -n),同时还要为系统其他开销留余量。**
看当前进程级限制
worker_connections 的直接天花板是 nginx worker 进程自身的 ulimit -n 值。这个值必须 ≥ 你打算设的 worker_connections。
- 查当前生效值:
cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files" - 该值由三处共同决定:用户级 limits.conf、systemd service 的 LimitNOFILE、启动会话的 ulimit -n
- 例如,若 limits.conf 中给 nginx 用户设了
hard nofile 65536,且 systemd override 里也配了LimitNOFILE=65536,那 worker_connections 最高可设到 65536
留足系统余量
即使进程能开 65536 个 fd,也不建议把 worker_connections 直接设到顶。因为系统还需用 fd 处理日志、临时文件、监控连接等。
- 推荐按 0.9 × ulimit -n 来设 worker_connections
- 比如 ulimit -n 是 65536,则 worker_connections ≤ 58982(取整为 58982 或更稳妥的 52428)
- 若机器还跑其他服务(如日志收集 agent、监控 exporter),余量还得再加
匹配 worker_processes 和 worker_rlimit_nofile
worker_connections 不是孤立参数,它要和另外两个配置对齐:
- worker_processes:通常设为 auto(等于 CPU 核心数),若手动设为 8,那总连接能力就是 8 × worker_connections
- worker_rlimit_nofile:必须 ≥ worker_processes × worker_connections,否则 Nginx 启动时会拒绝加载配置
- 例如 worker_processes auto(8 核)、worker_connections 8192 → worker_rlimit_nofile 至少设为 65536
别忽略内核全局限制
单个进程能开再多 fd,也得系统全局允许。检查:
-
cat /proc/sys/fs/file-max—— 全局最大句柄数 - 建议该值 ≥ 1.2~1.5 × (worker_processes × worker_connections)
- 比如理论总连接 65536,则 file-max 至少设为 78643~98304
- 修改方式:
echo 100000 > /proc/sys/fs/file-max(临时)或写入/etc/sysctl.conf











