调整国内服务器 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 也无意义。
分步处理
按顺序执行以下三步,确保系统、内核、应用三层配置对齐。
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 nginx2. 同步设置 Nginx 进程级句柄上限
在 nginx.conf 主配置中显式声明能申请的 fd 上限,该值应大于或等于 worker_connections。
# 在 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 错误日志,要结合系统指标交叉判断,确认配置已实际加载。
- 验证句柄上限:执行 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 连接数上限解析与调整指南