open_file_cache通过缓存文件元数据(如存在性、大小、修改时间等)并复用已打开的fd,显著降低高并发下stat()和open()系统调用开销,实测万级qps延迟下降30%以上。

直接用 open_file_cache 缓存文件元数据,是优化 Nginx 静态文件打开性能最有效的方式——它不缓存内容,但把文件是否存在、大小、修改时间、权限、是否可读等信息记在内存里,省去每次请求都调用 stat() 和 open() 的系统开销。
为什么 open_file_cache 能降低文件打开延迟
Nginx 默认每处理一个静态请求(比如访问 /logo.png),都要向操作系统发起至少一次 stat() 系统调用确认文件状态,再调用 open() 获取文件描述符。高并发下,这些微小调用会快速累积成 I/O 和 CPU 瓶颈。
open_file_cache 把这些元数据和已打开的 fd 一起缓存起来。后续相同路径的请求可直接复用,跳过磁盘查询和内核态切换,实测万级 QPS 下文件访问延迟下降 30% 以上。
必须配齐的五个关键参数
只写 open_file_cache on; 或只设 max 是无效的。需在 http 块中同时配置:
-
容量与淘汰:
open_file_cache max=5000 inactive=60s;—— 最多缓存 5000 个条目;60 秒内未被访问即标记为非活跃,等待清理 -
主动校验周期:
open_file_cache_valid 30s;—— 每 30 秒重新stat一次缓存项,确保不返回已删除或重命名的旧文件信息 -
准入门槛:
open_file_cache_min_uses 2;—— 同一文件需在inactive时间窗口内被访问 ≥2 次才进入缓存,避免爬虫乱扫污染缓存 -
错误也缓存:
open_file_cache_errors on;—— 把 404、403 等结果同样缓存,防止反复探测无效路径 -
变更感知(可选但推荐):
open_file_cache_events on;—— 基于 inotify 实时监听文件变化,比轮询更及时;若环境不支持,靠valid轮询兜底
按资源类型差异化配置
不是所有静态文件都适合统一策略:
-
稳定小文件(带哈希的 JS/CSS、字体、图标):全局开启,
inactive可延长至 120s,提升复用率 -
可能热更新的大文件(PDF、封面图、用户上传图):在对应
location中显式关闭:open_file_cache off;,避免 stale 元数据导致 404 或旧内容残留 -
敏感配置类文件(TLS 证书、密钥):确保
open_file_cache_valid足够短(如 10s),便于快速感知轮换
验证是否真正生效
配置后不能只看是否 reload 成功,要观察实际效果:
- 用
lsof -p $(pgrep nginx) | wc -l查看 worker 进程打开的文件数是否趋于稳定(不再随请求数线性增长) - 运行
strace -p $(pgrep nginx) -e trace=open,stat,对比开启前后open/stat调用频次是否明显下降 - 检查 error 日志:若出现
open() "/path/to/file" failed (2: No such file or directory)后不再重复报错,说明open_file_cache_errors on已起作用 - 通过内置变量统计命中率:在 log_format 中加入
$open_file_cache_hits和$open_file_cache_misses,计算缓存命中率











