国内服务器 Nginx 并发连接数限制怎么调整?

文章导读
调整国内服务器 Nginx 并发连接数限制,不能只改 Nginx 配置文件,必须同步提升操作系统文件描述符上限和内核网络队列参数。仅调大 worker_connections 而不修改系统 ulimit 会导致 Too many open files 错误,实际并发无法提升。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

调整国内服务器 Nginx 并发连接数限制,不能只改 Nginx 配置文件,必须同步提升操作系统文件描述符上限和内核网络队列参数。仅调大 worker_connections 而不修改系统 ulimit 会导致 Too many open files 错误,实际并发无法提升。

先说结论:Nginx 并发上限由操作系统文件描述符、Nginx 进程句柄声明和内核网络队列三者共同决定,缺一不可。

  • 适合:高并发 Web 服务、API 网关、长连接场景(如 WebSocket)
  • 先准备:确认服务器内存充足,备份 nginx.conf 和系统配置文件
  • 验收:通过/proc/limits 验证句柄上限,使用 ss -s 查看连接状态

命令速用版

以下是快速检查和生效配置的核心命令,适用于 CentOS 等主流 Linux 发行版:

# 查看当前进程文件描述符限制
cat /proc/$(pgrep nginx)/limits | grep "Max open files"

# 检查 Nginx 配置语法
nginx -t

# 重新加载配置(不中断服务)
systemctl reload nginx

# 查看当前连接状态统计
ss -s

为什么会这样

Nginx 本身不硬拦截连接,但系统和配置共同构成了一道多层防线。每个 TCP 连接至少占用 1 个文件描述符,若系统级限制低于 Nginx 配置值,Nginx 启动时会日志警告并自动降级。监听 socket 的 accept 队列满(net.core.somaxconn 不足)会导致新 SYN 包被内核直接丢弃,此时调高 Nginx 配置无效。连接还没进 Nginx 就被内核丢弃,调高 worker_connections 也无意义。

国内服务器 Nginx 并发连接数限制怎么调整?

分步处理

按顺序执行以下三步,确保系统、内核、应用三层配置对齐。

1. 打通系统级文件描述符限制

Linux 默认单进程最多打开 1024 个 fd,需永久修改 limits.conf 和 systemd 配置。

# 编辑/etc/security/limits.conf,添加以下内容
nginx soft nofile 65536
nginx hard nofile 65536

# 若使用 systemd 管理,创建/etc/systemd/system/nginx.service.d/override.conf
[Service]
LimitNOFILE=65536

# 重载 systemd 并重启 Nginx
systemctl daemon-reload
systemctl restart nginx

2. 同步设置 Nginx 进程级句柄上限

在 nginx.conf 主配置中显式声明能申请的 fd 上限,该值应大于或等于 worker_connections。

国内服务器 Nginx 并发连接数限制怎么调整?
# 在 nginx.conf 主块(events 块之外)添加
worker_rlimit_nofile 65536;

events {
    use epoll;             # Linux 下必须显式指定
    worker_connections 8192; # 单 worker 最大连接数
    multi_accept on;       # 一次性接受多个新连接
}

3. 匹配内核网络队列与事件模型

修改内核参数以避免 SYN 包丢弃,确保网络层能承载高并发。

# 编辑/etc/sysctl.conf,添加或修改
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 25000

# 生效配置
sysctl -p

怎么验证是否生效

不能只看 Nginx 错误日志,要结合系统指标交叉判断,确认配置已实际加载。

国内服务器 Nginx 并发连接数限制怎么调整?
  • 验证句柄上限:执行 cat /proc/$(pgrep nginx)/limits | grep "Max open files",输出软硬限制都应为设定值(如 65536)。
  • 验证连接状态:使用 ss -s 查看 sockets in use,若 established 接近 worker_connections × worker_processes 且 synrecv 持续存在,说明连接已饱和。
  • 验证配置语法:执行 nginx -t,确保输出 configuration file test is successful。

常见坑

  • 配置未生效:worker_rlimit_nofile 设为 100000 但系统 ulimit -n 只有 4096,Nginx 会自动将 worker_connections 降至 4096 级别。
  • Windows 限制:Windows 下 Nginx 并发受限于系统句柄上限(默认 16384)及单 worker 进程模型,实际并发通常远低于 Linux,且不支持 epoll。
  • 内存压力:每个连接占用几 KB 内存,worker_processes × worker_connections 过高可能导致 OOM Killer 干掉 worker 进程。
  • 事件模型回退:未启用 epoll 或 multi_accept,单次只能 accept 一个连接,高并发下大量连接卡在队列尾部。

常见问题

Nginx 默认并发连接数是多少?

默认 worker_connections 通常为 1024,但受操作系统 ulimit -n 限制,实际值可能更低。

出现 Too many open files 错误怎么办?

说明系统文件描述符限制低于 Nginx 需求,需修改/etc/security/limits.conf 和 worker_rlimit_nofile。

Windows 服务器能调高并发吗?

可以但效果有限,Windows 下 worker_processes 固定为 1,且受系统句柄上限 16384 限制,建议优先使用 Linux。

参考来源

  • Nginx 如何处理并发连接数超过限制的情况
  • 怎么通过优化 Worker_Connections 硬性提升单个 Nginx 节点的并发连接承载上限
  • centos nginx 连接数限制调整
  • Windows 下 Nginx 并发连接数限制配置与优化指南
  • Nginx 连接数有上限吗?(突破 Nginx 连接数限制的方法)
  • 后端面试必备:Nginx 连接数上限解析与调整指南