Nginx 反向代理高并发场景下怎么调整 worker_connections 参数?

文章导读
调整 worker_connections 并不是单纯改大数字就行,必须同步提高操作系统的文件描述符限制,适合在日志中出现"too many open files"或连接被拒绝时进行扩容。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

调整 worker_connections 并不是单纯改大数字就行,必须同步提高操作系统的文件描述符限制,适合在日志中出现"too many open files"或连接被拒绝时进行扩容。

先说结论:该参数受限于操作系统文件描述符上限,需配合 worker_processes 综合计算,盲目调大却不修改系统限制会导致配置生效失败。

  • 先定位:查看错误日志确认是否触及文件描述符限制或连接数上限。
  • 先做:同时修改 Nginx 配置与系统 ulimit 限制,确保两者匹配。
  • 再验证:重载配置后通过压力测试或监控观察活跃连接数是否增长。

命令速用版

以下命令用于快速查看当前限制状态并重载配置,操作前请确保已有备份。

# 查看当前用户文件描述符限制
ulimit -n

# 查看 Nginx 主进程 PID
ps -ef | grep nginx

# 查看 Nginx 进程实际打开的文件描述符数
ls -l /proc/<nginx_pid>/fd | wc -l

# 测试配置语法并平滑重载
nginx -t && systemctl reload nginx

为什么会这样

Nginx 处理每个连接都需要占用一个文件描述符(File Descriptor)。在反向代理场景下,一个客户端请求会建立两条连接:一条是客户端到 Nginx,另一条是 Nginx 到上游服务器。这意味着每个并发请求至少消耗 2 个文件描述符。

worker_connections 定义了每个 worker 进程能打开的最大连接数,但它的上限不能超过操作系统对单个进程允许打开的文件描述符数量(即 ulimit -n)。如果 Nginx 配置的值超过了系统限制,Nginx 启动或重载时会报错,或者在实际运行中无法建立新连接。

分步处理

按照以下顺序调整,避免配置生效但实际无法承载高并发。

Nginx 反向代理高并发场景下怎么调整 worker_connections 参数?

1. 检查当前系统限制
执行 ulimit -n 查看当前 shell 环境的限制。生产环境通常需要通过 systemd 或 limits.conf 永久修改,而非仅在当前终端生效。

2. 修改系统级限制
如果是 systemd 管理的 Nginx,编辑服务文件 /etc/systemd/system/nginx.service 或 /usr/lib/systemd/system/nginx.service,在 [Service] 段添加:

LimitNOFILE=65535

修改后执行 systemctl daemon-reload 使 systemd 配置生效。

3. 调整 Nginx 配置
编辑 nginx.conf,在 events 块中修改 worker_connections。建议值通常与系统 LimitNOFILE 保持一致或略低,预留空间给其他文件占用:

events {
    worker_connections 65535;
    multi_accept on;
}

注意:最大并发连接数理论值 = worker_processes * worker_connections。worker_processes 通常设置为 auto 或 CPU 核心数。

Nginx 反向代理高并发场景下怎么调整 worker_connections 参数?

4. 重载服务
执行 nginx -t 确认配置无误,然后 systemctl reload nginx。避免使用 restart 以免中断现有连接。

怎么验证是否生效

配置调整后,需要通过实际指标确认限制已解除。

1. 检查错误日志
查看 error.log,确认没有"worker_connections are not enough"或"too many open files"类错误。

2. 观察活跃连接
若未启用状态页,需在 server 块中配置 stub_status 模块:

server {
    listen 8080;
    location /status {
        stub_status;
        allow 127.0.0.1;
        deny all;
    }
}

配置后访问状态页查看 Active connections 数值。或者使用命令查看进程打开的文件描述符数量是否接近新设定值:

Nginx 反向代理高并发场景下怎么调整 worker_connections 参数?
ls -l /proc/<nginx_pid>/fd | wc -l

3. 压力测试
使用压测工具发起高于旧限制的并发请求,观察响应是否成功,同时监控系统资源。例如使用 wrk 工具:

wrk -t12 -c400 -d30s http://127.0.0.1/

常见坑

1. 忽略上游连接消耗
反向代理模式下,连接数是双倍的。如果 worker_connections 设为 1000,实际能服务的客户端并发可能只有 500 左右,需预留余量。

2. 仅修改 Nginx 配置
只改 nginx.conf 而不改系统 ulimit 或 systemd LimitNOFILE,会导致 Nginx 无法使用高连接数,甚至启动失败。

3. 盲目调大导致上下文切换
虽然文件描述符允许很大,但过高的并发会导致 CPU 上下文切换频繁。公开资料中没有看到可靠的量化数据表明具体多少数值是性能拐点,建议根据监控逐步调整。

4. 忘记修改启动用户限制
Nginx 主进程通常由 root 启动,但 worker 进程可能由 nginx 用户运行。需确保 nginx 用户的限制也已修改,例如在 /etc/security/limits.conf 中添加 nginx soft nofile 65535。

参考来源

  • Nginx 官方文档:Core module - worker_connections,描述了该指令的功能及上下文限制。
  • Nginx 官方文档:Operating System Tuning,提到了文件描述符限制与 Nginx 性能的关系。