worker_connections需与系统文件描述符限制、Nginx进程级rlimit、内核网络参数协同配置,否则触发“Too many open files”错误;须同步调整ulimit、worker_rlimit_nofile、sysctl及events块参数,并依业务类型合理设值。

worker_connections 不是孤立可调的数字,它必须和系统资源、内核参数、Nginx 自身限制形成闭环,否则只会触发 “Too many open files” 错误。
对齐系统级文件描述符限制
每个连接占用至少 1 个文件描述符(fd),Linux 默认单进程上限为 1024。若设了 worker_connections 8192,但 ulimit -n 仍是 1024,真实上限就是 1024。
- 编辑 /etc/security/limits.conf,添加两行(把 nginx 替换为实际运行用户,如 www-data):
nginx soft nofile 65536
nginx hard nofile 65536 - systemd 管理的服务还需在 /etc/systemd/system/nginx.service.d/override.conf 中加入:
[Service]
LimitNOFILE=65536 - 执行 systemctl daemon-reload && systemctl restart nginx 后,用 cat /proc/$(pgrep nginx)/limits | grep "Max open files" 验证软硬限制是否生效
同步设置 Nginx 进程级句柄上限
系统允许 ≠ Nginx 能用。Nginx 主配置中必须显式声明它能申请的 fd 上限,否则会自我限制。
- 在 http 块外添加:worker_rlimit_nofile 65536;
- 该值应 ≥ worker_connections,推荐设为相同值或略高(如 1.2 倍),为日志、上游连接等留余量
- 若 worker_rlimit_nofile 超过系统硬限制(ulimit -Hn),Nginx 启动会失败或静默降级
匹配内核网络队列与事件模型
连接还没进 Nginx 就被内核丢弃,调高 worker_connections 也无意义。
- 修改 /etc/sysctl.conf:
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 25000
执行 sysctl -p 生效 - 在 events 块中强制启用高效模型:
use epoll;(Linux 下必须显式指定)
multi_accept on;(让一个 worker 在一次事件循环中尽可能多地 accept 新连接)
结合业务类型设合理值
数值不是越大越好。每个连接占用几 KB 内存,过高会加剧内存压力与上下文切换开销。
- 静态资源或短连接 API:可设 4096–16384
- WebSocket、HTTP/2 或直播流长连接:建议 2048–8192,并配合控制空闲时长(如 keepalive_timeout 和 client_body_timeout)
- 推拉流场景(如 RTMP + HTTP-FLV):并发连接数 = worker_processes × worker_connections,需按实际观众数反推,避免盲目堆高



















