必须同时配置open_file_cache及其四项配套参数才能真正缓存文件元数据:max=10000 inactive=60s、open_file_cache_valid 30s、open_file_cache_min_uses 2、open_file_cache_errors on,且仅支持http或server块,需配合sendfile、前缀匹配、日志优化及inotify调优协同生效。

直接配置 open_file_cache 并配齐全部关键参数,才能真正缓存文件元数据(如存在性、大小、修改时间、权限、inode 信息),跳过反复的 stat() 和 open() 系统调用,降低内核开销。
必须同时设置五项参数
单独写 open_file_cache 不生效。以下五项需成对出现,构成完整闭环:
- max=10000 inactive=60s:限制缓存容量与淘汰周期。例如最多存 10000 条,60 秒未访问即标记为待清理
- open_file_cache_valid 30s:每 30 秒主动校验一次缓存项是否仍有效(文件是否被删、权限是否变更)
- open_file_cache_min_uses 2:同一文件需在 60 秒内被访问至少 2 次才进入长效缓存,避免冷路径污染
-
open_file_cache_errors on:把
ENOENT(404)、EACCES(403)等错误结果也缓存住,防止恶意扫描反复触发系统调用
只能放在 http 或 server 块中
该指令不支持出现在 location 内。它作用于所有由当前作用域解析出的真实文件路径(包括 root、alias、try_files 后的路径)。若多个站点静态资源分布差异大,建议在各自 server 块中独立配置,避免缓存被无关路径占用。
配合系统策略协同生效
仅靠 Nginx 配置不够,还需底层协同:
- 确保
sendfile on;开启——它依赖内核 page cache,而 page cache 的刷新与 inode 状态强相关 - 静态资源 location 优先用前缀匹配(如
location /static/ { }),避免正则匹配带来的额外路径解析开销 - 关闭非必要日志:
access_log off;或log_not_found off;,防止日志写入本身成为 inode 热点 - 检查并适当调高 inotify 限制:
/proc/sys/fs/inotify/max_user_watches,尤其启用open_file_cache_events时
按实际负载调整数值
max 值不是越大越好。每个缓存条目约占用 100–200 字节内存,10000 条 ≈ 1–2 MB。可通过 lsof -p $(pgrep nginx) | wc -l 观察当前 worker 进程打开的 fd 总数,将其作为 max 设置的参考下限。对于稳定不变的小文件(如带哈希的 JS/CSS),可延长 inactive 至 120s;对可能热更新的大文件(如 PDF 封面),建议在对应 location 中关闭缓存。











