要让nginx在反向代理场景下稳定支撑数万并发,必须协同调优worker_rlimit_nofile、系统级文件描述符限制、内核参数及events配置;单独修改任一环节易触发“too many open files”或502错误。

要让 Nginx 在反向代理场景下稳定支撑数万并发连接,worker_rlimit_nofile 不是孤立配置项,必须和系统级限制、内核参数、Nginx 事件模型协同调优。单独改一个地方,往往卡在“Too many open files”或 502 错误上。
确认并提升系统级文件描述符上限
Linux 对每个进程默认限制为 1024(ulimit -n),这远远不够。反代每条连接 + 每个 upstream socket + 日志句柄都会占用一个 fd。
- 临时验证:运行
ulimit -n 65535(仅当前 shell 有效) - 永久生效:编辑
/etc/security/limits.conf,添加两行(假设 Nginx 以nginx用户运行):
nginx soft nofile 65535
nginx hard nofile 65535 - 若使用 systemd(绝大多数现代发行版),还需创建
/etc/systemd/system/nginx.service.d/override.conf:
[Service]
LimitNOFILE=65535 - 重载 systemd 配置:
systemctl daemon-reload,再重启 Nginx
在 nginx.conf main 块中正确设置 worker_rlimit_nofile
该指令必须放在 http、events 等块之外的最外层(main 上下文),否则会报“unknown directive”错误。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 典型写法(置于
user和events之间):
worker_rlimit_nofile 65535; - 数值建议与系统硬限制一致或略低(如硬限为 65535,则设 65535;若硬限为 1048576,可设 1000000 留余量)
-
注意:修改后必须
systemctl restart nginx(不是 reload),因为资源限制只在 worker 进程启动时继承
同步调优 events 块与内核网络参数
仅提高 fd 数量还不够——连接队列、端口复用、事件处理效率都需匹配。
- 在
events块中启用高效模型并扩大单 worker 容量:
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
注意:worker_connections应 ≤worker_rlimit_nofile,否则启动警告 - 调大内核连接队列:
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
写入/etc/sysctl.conf后执行sysctl -p - 反代场景特别注意:
proxy_buffering off或合理配置 buffer 大小,避免大量 fd 被缓冲区长期占用
验证是否真正生效
别依赖配置写了就等于起效,务必检查运行时状态。
- 查任一 worker 进程 PID:
ps -eo pid,comm | grep 'nginx: worker' - 查看其实际限制:
cat /proc/<pid>/limits | grep "Max open files"</pid>
输出中 Soft Limit 应等于你设置的worker_rlimit_nofile值 - 观察错误日志:
tail -f /var/log/nginx/error.log,确认不再出现(24: Too many open files) - 压测时监控:
ss -s查总 socket 数,cat /proc/net/sockstat看已用/可用端口,交叉验证瓶颈是否转移










