worker_connections不是越大越好,必须与内存容量、业务连接特征(短连/长连/https)、系统文件描述符限制三者严丝合缝对齐,否则将触发“too many open files”或内存耗尽;需同步调优ulimit、worker_rlimit_nofile、net.core.somaxconn及events参数。

worker_connections 不是越大越好,也不是随便填个数字就能用。它必须和服务器内存、业务连接特征、系统文件描述符限制三者严丝合缝地对齐,否则不是压不住流量,就是触发“Too many open files”或内存耗尽。
先算单连接真实内存开销
不同业务场景下,每个连接占用的内存差异很大:
- 纯静态服务(无 SSL、无代理):约 20–50 KB/连接
- 启用 HTTPS(含 TLS 上下文 + 缓冲):约 100–250 KB/连接
- 反向代理 + HTTP/1.1 + 默认 proxy_buffer:约 300–600 KB/连接
- 若启用了 large_client_header_buffers 或自定义大 buffer,单连接可能突破 1 MB
举例:一台 8 GB 内存服务器,预留 2 GB 给系统和其他进程,Nginx 可用约 6 GB。若走 HTTPS 代理,平均连接占 400 KB,则理论最大连接数 ≈ 6 × 1024 ÷ 0.4 ≈ 15,360。再除以 worker_processes(比如设为 4),单个 worker_connections 就应控制在 3840 左右,取整为 4096 更稳妥。
必须同步打通三层资源限制
只改 worker_connections 是无效的,它只是“标尺”,真正起作用的是下面这三层是否一致:
-
系统级 fd 限制:编辑 /etc/security/limits.conf,添加
nginx soft nofile 65536
nginx hard nofile 65536
若用 systemd,还需在 /etc/systemd/system/nginx.service.d/override.conf 中加 LimitNOFILE=65536,并执行 systemctl daemon-reload && systemctl restart nginx -
Nginx 进程级声明:在 nginx.conf 主块(events 外、http 前)添加
worker_rlimit_nofile 65536;
该值应 ≥ worker_processes × worker_connections,建议略高 10%~20% - 内核网络队列:确保 net.core.somaxconn ≥ 65535,net.core.netdev_max_backlog ≥ 25000,避免连接在进 Nginx 前就被丢弃
按业务类型设合理值
盲目堆高反而拖慢性能,应结合连接生命周期来定:
- 短连接密集型(如 API 网关、H5 秒杀页):连接快建快关,推荐 4096–16384;重点保障吞吐,keepalive_timeout 可设 15–30s
- 长连接保活型(如 WebSocket、HTTP/2 上报、直播流):fd 占用稳定但总量大,建议 2048–8192;配合 keepalive_timeout 60–300s 控制空闲释放
- HTTPS 反向代理:需额外消耗 SSL session cache、OCSP stapling 等 fd,worker_connections 不宜超过单进程 ulimit 的 70%~80%
配套 events 参数不能漏
光有容量还不够,得让连接接得快、分得匀、复用好:
- use epoll; — Linux 下必须显式指定,否则可能回退到 select/poll,卡死在 1024
- multi_accept on; — 让一个 worker 在一次事件循环中尽可能多地 accept 新连接
- accept_mutex off; — 高并发多 worker 场景下减少锁争抢(尤其搭配 reuseport 时)
- 注意:worker_connections 必须放在 events { } 块内,写错位置 Nginx 启动会直接报错











