worker_connections必须与系统环境对齐才能生效:Linux需同步调高file-max、limits.conf中的nofile及worker_rlimit_nofile,并配置epoll、somaxconn等;容器环境须显式传递ulimit并设worker_processes;macOS/WSL受限于默认低限,需保守设值并验证实际限制。

worker_connections 不是随便改个数字就能生效的参数,它必须和系统环境“对得上号”。不同系统环境下,限制它的关键点不一样——Linux 侧重文件描述符和内核队列,容器环境要额外考虑资源隔离,而 macOS 或 Windows(WSL)则受限于底层机制差异。调优不是填一个大数,而是让 Nginx、进程限制、内核三者步调一致。
Linux 物理机或虚拟机:重点抓三层 fd 限制对齐
在标准 Linux 环境下,真正起作用的是三个值中的最小值:
-
/proc/sys/fs/file-max:系统级总上限,建议设为
worker_processes × worker_connections × 1.3~1.5,预留 TIME_WAIT、SSL 缓存、日志等开销 -
/etc/security/limits.conf 中 nginx 用户的 nofile 限制:比如
nginx soft nofile 65536和nginx hard nofile 65536,改完需重载 systemd 或重新登录会话 -
nginx.conf 主块中 worker_rlimit_nofile:必须 ≥ worker_connections,推荐设为相同值或 1.2 倍,例如
worker_rlimit_nofile 65536;
同时配套调整内核参数:net.core.somaxconn(建议 32768~65536)、net.ipv4.tcp_tw_reuse = 1,并确保 events 块启用 use epoll; 和 multi_accept on;。
容器环境(Docker/Kubernetes):资源限制优先于配置值
容器里不能只看 nginx.conf,得看宿主机和容器本身的双重约束:
- 容器启动时需显式传入 ulimit,如
docker run --ulimit nofile=65536:65536 ...;K8s 中通过securityContext.fssGroup和resources.limits配合initContainer设置 limits.conf - 容器内 nginx 进程的
worker_rlimit_nofile必须 ≤ 容器 ulimit,否则启动时静默降级 - 注意
worker_processes auto在容器中可能识别错误(如看到宿主机 CPU 数),建议显式设为worker_processes 2;或按分配的 vCPU 数指定 - 若用 sidecar 模式(如 Istio),上游连接也占 fd,worker_connections 要留出 20%~30% 余量
macOS 或 WSL:避免默认限制陷阱
macOS 和 WSL 的默认 ulimit 极低(常为 256 或 1024),且部分内核参数不可调:
- macOS 上无法修改
net.core.somaxconn,只能靠worker_connections保守设置(建议 ≤ 2048),并启用accept_mutex on;缓解争抢 - WSL2 虽基于 Linux 内核,但默认 file-max 往往偏低,需在
/etc/wsl.conf中添加[kernel]段启用sysctl参数,并重启 WSL - 两类环境都建议关闭
multi_accept on;(WSL2 有时触发异常),改用更稳的默认策略 - 验证方式统一:进容器或终端执行
ulimit -n,再查运行中 worker 的cat /proc/$(pgrep nginx)/limits | grep "Max open files"
高频短连接 vs 长连接场景:数值逻辑完全不同
业务类型决定 worker_connections 的合理区间,不是越大越好:
-
短连接为主(如 CDN 回源、API 网关):连接建立快、释放快,fd 消耗集中在 accept 阶段。建议设 4096~8192,重点调高
net.core.somaxconn和开启multi_accept,缓解突发堆积 -
长连接保活(如 WebSocket、HTTP/2 上报通道):单连接复用时间长,fd 占用稳定但总量大。可设 32768~65535,但必须确保
worker_rlimit_nofile和file-max充足,且keepalive_timeout与业务心跳匹配 - HTTPS 代理场景:除 socket 外还需 SSL session cache、OCSP stapling、证书读取等额外 fd。worker_connections 建议不超过单进程 ulimit 的 75%,例如 ulimit 65536,则设 ≤ 49152











