open_file_cache的核心价值是将磁盘stat()/open()调用转为内存查询,大幅降低高频小文件及不存在路径的i/o压力;它只缓存文件存在性、元数据和fd,不缓存内容,并需max、inactive、valid、min_uses、errors五参数协同生效。

open_file_cache 的核心价值,是把原本每次请求都要走磁盘的 stat() 和 open() 系统调用,变成查内存——尤其对高频访问但内容不变的小文件、以及大量根本不存在的黑名单路径,I/O 压力能直接降一个数量级。
缓存什么?不缓存什么?
它不存文件内容,只缓存三类轻量信息:
- 文件是否存在(包括 404、403 这类错误状态)
- 文件大小、最后修改时间、权限等元数据
- 已打开的文件描述符(fd),避免反复 open/close
正因为不碰真实内容,它才能以极低内存开销,精准掐住磁盘 I/O 的“毛细血管”——那些高频小请求引发的海量系统调用。
必须配齐的五个参数,少一个都打折扣
单独写 open_file_cache on; 完全无效。真正起效的是这五项协同:
- max=10000 inactive=60s:最多缓存 1 万个条目;60 秒内没被访问就准备淘汰
- open_file_cache_valid 30s:每 30 秒主动校验一次缓存项是否还准确(比如文件刚被上传或删了)
- open_file_cache_min_uses 2:同一路径在 inactive 时间窗口内至少被访问 2 次,才允许进缓存——过滤试探性扫描
- open_file_cache_errors on:把“文件不存在”“权限拒绝”等错误结果也缓存住,这是防恶意扫描的关键
- 不需要额外写
on,只要上述四项都在 http 块中,机制自动激活
针对不同场景的配置倾向
不是所有文件都该一视同仁缓存:
-
index.html 或 SPA 入口页:设
inactive=20s,匹配用户快速刷新/回退行为;min_uses=2防污染 -
带哈希的静态资源(如 app.abc123.js):可放宽到
inactive=300s、valid=60s,它们上线后几乎不变 -
黑名单路径探测(如 /.git/config):靠
min_uses+errors on组合,让高频扫的 404 路径快速进缓存,后续直接返回,零磁盘查询
配合其他措施才能发挥最大效果
open_file_cache 是减负主力,但不是万能解药:
- 前置用
map或location精准拦截已知黑名单路径,别全丢给它扛 - 静态资源服务关闭
access_log或启用缓冲(buffer=64k flush=5s),减少日志引发的 stat 开销 - 挂载磁盘时加
noatime,省掉每次读都更新 atime 的元数据写入 - 禁用
directio,让小文件读取走内核 page cache,而不是绕过去直触磁盘











