Nginx 稳定打开海量静态文件的关键是同步调优三级文件描述符限制:系统级(/etc/security/limits.conf)、systemd级(override.conf)和Nginx配置级(worker_rlimit_nofile),并配套调整worker_connections与open_file_cache。

要让 Nginx 稳定打开海量静态文件(比如数万张图片、CSS/JS 文件),关键不是堆高 worker_connections,而是确保每个 worker 进程有足够多的文件描述符可用。worker_rlimit_nofile 就是这个“开门权限”的开关——但它必须和系统底层限制对齐,单独配置无效。
确认当前瓶颈在哪
别急着改配置,先看真实限制卡在哪儿:
- 查 Nginx 主进程运行用户:
ps -eo pid,comm,user | grep nginx | grep master(常见为www-data或nginx) - 查该用户的软硬限制:
sudo -u nginx bash -c "ulimit -Sn; ulimit -Hn" - 查 systemd 服务限制(若用 systemd):
systemctl show nginx | grep LimitNOFILE - 查正在运行的 worker 进程实际值:
cat /proc/$(pgrep nginx | head -2 | tail -1)/limits | grep "Max open files"
同步打通三级限制链路
worker_rlimit_nofile 的值必须 ≤ 系统为 Nginx 用户设置的硬限制,且需三处一致才真正生效:
- 系统级:编辑
/etc/security/limits.conf,添加两行(用户名按实际替换)nginx soft nofile 131072nginx hard nofile 131072 - systemd 级(推荐):创建
/etc/systemd/system/nginx.service.d/override.conf,写入[Service]LimitNOFILE=131072
然后执行sudo systemctl daemon-reload && sudo systemctl restart nginx - 确保 PAM 生效:检查
/etc/pam.d/common-session是否含session required pam_limits.so
正确配置 worker\_rlimit\_nofile
这个指令必须放在 nginx.conf 最外层(main 上下文),也就是 events 块之前、http 块之外:
- 语法简单:
worker_rlimit_nofile 131072; - 数值建议设为硬限制的 90% 左右(如硬限 131072,则配 118000~128000),预留空间给访问日志、SSL 会话缓存、临时文件等
- 切勿写在
http、server或location块内——那样会直接被忽略
配套调优与验证
光开大句柄还不够,得让 Nginx 合理用起来:
-
worker_connections应设为worker_rlimit_nofile的 70%~90%,避免把所有句柄全占满导致无余量处理日志或 upstream 连接 - 开启
open_file_cache缓存文件元信息(如存在性、权限、修改时间),减少重复open()调用:open_file_cache max=10000 inactive=60s;open_file_cache_valid 60s;open_file_cache_min_uses 2; - 重启后验证:
cat /proc/$(pgrep nginx | head -2 | tail -1)/limits | grep "Max open files",Soft Limit 应与配置值一致


















