open_file_cache是nginx缓存文件元数据(非内容)的机制,可显著减少stat()系统调用、降低i/o和cpu开销;推荐全局配置max=10000 inactive=60s valid=30s min_uses=2 errors on。

open_file_cache 是 Nginx 用来缓存文件元数据(如文件是否存在、是否可读、inode、mtime、大小等)的机制,不缓存文件内容本身。它对静态资源服务性能提升非常关键——尤其在高并发、小文件多(如图标、字体、CSS/JS 分片)的场景下,能显著减少 stat() 系统调用开销,降低磁盘 I/O 和 CPU 消耗。
为什么需要配置 open_file_cache?
Nginx 每次处理静态请求(如 location ~ \.js$),默认都会执行一次 stat() 系统调用去确认文件状态。若未启用缓存,大量请求会频繁触发磁盘元数据查询,成为性能瓶颈。启用后,Nginx 在内存中维护一个轻量级缓存表,大幅提升文件查找效率。
核心指令与推荐配置
在 http、server 或 location 块中配置(推荐放在 http 块全局生效):
open_file_cache max=10000 inactive=60s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;
max=10000
缓存条目上限。建议按站点静态资源总量预估:1 万条可覆盖数万个常用文件(如 5k 图片 + 2k JS/CSS + 其他)。超出后按 LRU 清理。inactive=60s
条目在 60 秒内未被再次访问,就从缓存中移除。不宜设过长(如数小时),否则可能滞留已删除或重命名的旧文件信息,导致 404 不及时更新。open_file_cache_valid 30s
每隔 30 秒,Nginx 主动检查缓存中条目的有效性(重新stat一次)。这是「被动验证」周期,应略短于inactive,确保失效感知及时。open_file_cache_min_uses 2
只有某文件在inactive时间窗口内被访问 ≥2 次,才将其加入缓存。避免一次性请求(如爬虫乱扫)污染缓存。open_file_cache_errors on
把not found、access denied等错误结果也缓存住。防止恶意扫描或错误路径反复触发系统调用。搭配inactive使用,错误项也会自动过期。
配置位置与生效范围
- 放在
http { ... }块中:全局生效,适用于所有 server。 - 若只针对静态资源目录,可放在
server或location块中,但需注意:open_file_cache是进程级共享缓存,子块配置会继承并叠加,不推荐嵌套重复配置,易引发不可预期行为。
✅ 正确示例:
http {
open_file_cache max=8000 inactive=45s;
open_file_cache_valid 20s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
server {
root /data/www;
location ~* \.(js|css|png|jpg|gif|webp|woff2?)$ {
# 不再重复写 open_file_cache,直接复用 http 级配置
expires 1y;
add_header Cache-Control "public, immutable";
}
}
}
❌ 错误做法:在多个 location 中分别设置不同 max=,会导致覆盖或冲突。
验证是否生效
- 查看 Nginx 进程打开的文件数变化趋势(使用
lsof -p $(pgrep nginx) | wc -l),开启后应更平稳; - 启用
error_log /var/log/nginx/error.log debug;(临时),搜索open file cache相关日志(需编译时带--with-debug); - 实际压测对比:用
ab或wrk请求大量小静态文件,观察 CPU sys% 和平均延迟下降情况。
注意事项
-
open_file_cache不替代proxy_cache或浏览器缓存,三者作用层次不同:open_file_cache→ 减少 Nginx 自身文件系统开销;Cache-Control/expires→ 控制浏览器和 CDN 是否发请求;proxy_cache→ 缓存后端响应内容(用于反向代理场景)。 - 它对大文件(如视频、PDF)效果有限,因元数据占比小,瓶颈在传输而非
stat; - 修改后需
nginx -t && nginx -s reload生效,无需重启。
不复杂但容易忽略。











