worker_connections 必须与系统文件描述符三层限制(/proc/sys/fs/file-max、limits.conf、worker_rlimit_nofile)对齐才生效,实际并发上限取三者最小值,并需配套use epoll、multi_accept等events参数及业务类型合理设值。

worker_connections 不是独立生效的数字,它必须嵌在操作系统文件描述符(fd)资源链里才能真正起作用。设高了系统不认,设低了又压不住并发——关键在于让 Nginx 配置、进程限制、内核参数三者对齐。
先看清楚三层限制谁说了算
实际能用的连接数,取决于以下三者的最小值:
-
/proc/sys/fs/file-max:系统级总 fd 上限。建议设为
worker_processes × worker_connections × 1.3~1.5,预留 TIME_WAIT、日志写入、SSL 缓存、临时文件等开销 -
/etc/security/limits.conf 中的 nofile:Nginx 运行用户(如 nginx 或 www-data)的单进程软硬限制。例如:
nginx soft nofile 65536
nginx hard nofile 65536 -
nginx.conf 主块中的 worker_rlimit_nofile:Nginx 主进程向系统申请的 fd 总上限,必须 ≥ worker_connections。推荐设为相同值或略高(如 1.2 倍),例如:
worker_rlimit_nofile 65536;
按部署方式打通系统限制
改完 limits.conf 并不等于生效,还得看启动方式:
- 用 systemd(主流):新建
/etc/systemd/system/nginx.service.d/override.conf,写入
[Service]
LimitNOFILE=65536
然后执行sudo systemctl daemon-reload && sudo systemctl restart nginx - 不用 systemd:确认
/etc/pam.d/common-session包含session required pam_limits.so,否则 limits.conf 不加载 - 容器环境(Docker/K8s):启动时必须显式传 ulimit,比如
docker run --ulimit nofile=65536:65536;K8s 中需通过securityContext或 initContainer 设置,且worker_rlimit_nofile不能超过容器 ulimit
再配合理 worker_connections 数值
数值不是越大越好,要匹配业务类型和资源余量:
-
高频短连接(如 API 接口、秒杀页):4096–16384,配合
keepalive_timeout 0或设为 15–30s,启用net.ipv4.tcp_tw_reuse = 1 -
长连接保活型(如 WebSocket、HTTP/2 上报):2048–8192,重点保障 fd 资源充足,
keepalive_timeout控制在 15–75s -
HTTPS 反向代理:额外消耗 SSL session cache、OCSP stapling、证书读取等 fd,
worker_connections建议不超过单进程 ulimit 的 70%~80%
别漏掉配套 events 参数
只调 worker_connections 就像加宽车道却不修入口匝道:
-
use epoll;:Linux 必须显式声明,避免回退到 select/poll 的 1024 硬限 -
multi_accept on;:让一个 worker 在一次事件循环中尽可能多 accept 新连接,缓解突发流量排队 -
accept_mutex on;(macOS/WSL 或低并发场景可选):缓解多个 worker 对 accept 队列的争抢











