worker_rlimit_nofile是nginx单机支撑千万级并发的关键枢纽,须与fs.file-max、ulimit硬限、worker_connections及内核网络参数协同配置;必须设于main上下文,值≤用户hard nofile限制的90%,且需同步调整systemd limits、/etc/security/limits.conf和内核fs.file-max等三处系统限制,并优化net.core.somaxconn等tcp参数。

要让 Nginx 在单机支撑千万级并发时稳定运行,worker_rlimit_nofile 不是孤立参数,而是连接操作系统内核、进程限制与 Nginx 自身调度的关键枢纽。它必须和 fs.file-max、ulimit 硬限、worker_connections 以及关键内核网络参数协同生效——缺一环,就会在 50 万连接左右开始出现 “Too many open files” 或 accept() failed 错误。
worker_rlimit_nofile 的准确定位与合理取值
该指令必须写在 nginx.conf 的 main 上下文(即 events 块之前、http 块之外),语法为:
worker_rlimit_nofile 131072;
这不是“建议值”,而是硬性资源上限指令,其逻辑如下:
- 数值应 ≤ nginx 运行用户(如 www-data 或 nginx)的系统 hard nofile 限制(用
sudo -u nginx bash -c 'ulimit -Hn'查) - 推荐设为 hard limit 的 90%,例如 hard 为 145000,则设 131072(128K),预留空间给日志句柄、SSL session 缓存、临时文件等
- 不能写在 http/server/location 内,否则报 “unknown directive”
- 修改后必须 restart(非 reload),因为资源限制仅在 worker 进程启动时初始化
系统级限制必须三处同步打通
Nginx 无法突破启动时刻继承的限制。只改配置不调系统,该指令静默失效。需同时完成以下三项:
-
/etc/security/limits.conf:添加对应用户的软硬限制(以 nginx 用户为例)
nginx soft nofile 131072<br>nginx hard nofile 131072
-
systemd 服务限制(若用 systemd 启动):
创建/etc/systemd/system/nginx.service.d/override.conf:[Service]<br>LimitNOFILE=131072
执行systemctl daemon-reload && systemctl restart nginx -
验证是否真正加载:取一个 worker PID(
pgrep -f "nginx: worker" | head -1),再执行cat /proc/<pid>/limits | grep "Max open files"</pid>
输出中 Soft Limit 应等于你设置的值,Hard Limit ≥ 该值
内核全局句柄池必须扩容:fs.file-max
所有 worker 进程打开的总 fd 数不能超过内核允许的总数。默认值(通常 65536)远远不够千万级场景:
- 查看当前值:
cat /proc/sys/fs/file-max - 临时提升:
sysctl -w fs.file-max=2000000 - 永久生效:在
/etc/sysctl.conf中追加fs.file-max = 2000000,再执行sysctl -p - 建议值 =
worker_processes × worker_connections × 1.3~1.5,例如 16 个 worker × 65535 连接 ≈ 104 万,那么fs.file-max至少设为 160 万~200 万
配套内核网络参数优化(避免连接卡在中间态)
仅扩大文件句柄还不够,大量短连接或 keepalive 泛滥会导致 TIME_WAIT 积压、端口耗尽、SYN 队列溢出。需同步调整:
-
net.core.somaxconn = 262144:提升 listen backlog,匹配 Nginx 的listen ... backlog=65535 -
net.ipv4.ip_local_port_range = 1024 65500:扩大可用临时端口范围 -
net.ipv4.tcp_tw_reuse = 1:允许 TIME_WAIT socket 重用于新连接(安全且必要) -
net.ipv4.tcp_fin_timeout = 30:缩短 FIN-WAIT-2 超时,加快连接回收 -
net.ipv4.tcp_max_syn_backlog = 65535:防止高并发 SYN 洪水导致队列丢包
所有 sysctl 参数同样需写入 /etc/sysctl.conf 并执行 sysctl -p 生效。










