open_file_cache不缓存文件内容,只缓存文件描述符(fd)、大小、修改时间、存在性、权限、目录/符号链接等元数据,并需同时配置max、inactive、valid、min_uses、errors五项参数才生效。

open_file_cache 不缓存文件内容,而是把“文件是否存在”“大小多少”“最后修改时间”“权限是否允许”“是否为目录”“符号链接指向哪里”这些轻量元数据,连同已打开的文件描述符(fd)一起记在内存里。后续请求直接复用,跳过 open() 和 stat() 系统调用。
它具体缓存哪些信息
每个缓存条目包含以下关键数据:
- 文件描述符(fd):避免重复 open/close,实现句柄复用
- 文件大小(size)和最后修改时间(mtime):用于响应头中的
Last-Modified和Content-Length - 存在性与类型判断结果:比如是普通文件、目录,还是根本不存在
- 权限状态:如是否可读,避免反复触发
EACCES错误检查 - 符号链接目标路径(若启用
open_file_cache_retest)
缓存不是自动生效,必须配齐五项参数
单独写 open_file_cache on; 或只配 max 和 inactive 都无效。真正起作用需同时设置:
-
open_file_cache max=10000 inactive=60s;:最多存 1 万个条目;60 秒内没被访问就标记为待淘汰 -
open_file_cache_valid 60s;:每 60 秒主动检查一次缓存项是否仍有效(文件是否被删、改、权限变) -
open_file_cache_min_uses 2;:同一文件需在inactive时间窗内被访问至少 2 次才进缓存,防冷数据占位 -
open_file_cache_errors on;:把 404、403 这类错误也缓存,避免反复探测非法路径
缓存如何管理生命周期
底层使用红黑树 + 过期队列组织数据:
- 新访问的文件先查缓存,命中则直接返回 fd 和元数据
- 未命中且满足
min_uses条件,则执行open()/stat(),成功后存入缓存 - 后台定时器按
valid间隔扫描,对过期或失效条目做标记或清理 - 当缓存满时,按 LRU(最近最少使用)策略淘汰非活跃条目
缓存效果依赖系统级配合
光配 Nginx 不够,还要看底层是否撑得住:
-
worker_rlimit_nofile建议 ≥ 65535,否则缓存了 fd 也打不开新文件 - 若启用
open_file_cache_events,需确保/proc/sys/fs/inotify/max_user_watches足够大(建议 ≥ 缓存条目数 × 1.5) - 静态资源路径要收口,只在明确的
location中启用,避免日志、上传目录等干扰缓存质量











