worker_connections 直接定义单个 worker 进程最大并发连接数,但实际生效需满足:ulimit -n ≥ worker_connections、nginx.conf 中显式配置 worker_rlimit_nofile ≥ worker_connections,且须匹配 epoll、multi_accept 等 events 参数协同优化。

单个 Worker 进程能支持的最大并发网络连接,由 worker_connections 直接定义,但它不是孤立生效的数字——实际值受系统文件描述符限制、Nginx 自身资源声明和运行时行为共同约束。调优的关键是让这个参数“真正落地”,而不是写在配置里却卡在系统层。
先突破单进程文件描述符硬限制
Linux 默认每个进程最多打开 1024 个文件描述符(fd),而每个 TCP 连接至少占用 1 个 fd。若你设了 worker_connections 8192,但 ulimit -n 仍是 1024,那真实上限就是 1024。
- 临时验证:启动 Nginx 前执行
ulimit -n 65536 - 永久生效:编辑
/etc/security/limits.conf,添加两行(把nginx替换为实际运行用户,如www-data):nginx soft nofile 65536nginx hard nofile 65536 - 验证是否生效:
cat /proc/$(pgrep nginx)/limits | grep "Max open files"
同步设置 Nginx 进程级句柄上限
仅靠系统 limits 不够。Nginx 主配置中需显式声明它能申请的 fd 上限,否则即使系统允许,Nginx 也会自我限制。
- 在
nginx.conf的主上下文(http块之外)添加:worker_rlimit_nofile 65536; - 该值应 ≥
worker_connections,推荐设为相同值或略高(如 1.2 倍),为日志、上游连接等留余量
结合业务类型合理设值
数值不是越大越好。每个连接占用几 KB 内存,过高会加剧内存压力与上下文切换开销。
- 静态资源或短连接 API:可设 4096–16384
- WebSocket、HTTP/2 或直播流(HTTP-FLV)长连接:建议 2048–8192,并配合
keepalive_timeout 15–30控制空闲时长 - 反向代理且后端响应慢:连接会在 Nginx 中等待,此时更需优化
proxy_read_timeout和重试策略,而非盲目提高worker_connections
配套 events 块关键参数协同
只改 worker_connections 效果有限。必须匹配事件模型和连接接收机制:
-
use epoll;:Linux 必须显式指定,避免回退到有 1024 硬限的select/poll -
multi_accept on;:让一个 worker 在一次事件循环中尽可能多地 accept 新连接,缓解突发流量排队 -
accept_mutex on;:默认开启,防止多个 worker 同时争抢新连接造成“惊群”











