nginx 通过 open_file_cache 缓存文件描述符及元数据(如大小、修改时间等),减少磁盘 i/o 和 stat 系统调用,提升静态小文件并发访问性能;需在 http 块配置 max、inactive、valid、min_uses 和 errors 参数,并配合 sendfile、expires 等优化,通过日志变量验证命中率。

Nginx 通过 open_file_cache 缓存文件描述符和元数据(如文件大小、修改时间、权限等),能显著减少重复打开同一静态文件时的磁盘 I/O 和系统调用,尤其在高并发访问图片、CSS、JS 等小文件场景下效果明显。
这个机制不缓存文件内容本身,而是缓存“文件在哪里、是否还存在、有没有被修改”这类信息,让 Nginx 快速判断能否直接读取,避免每次请求都去查 inode 或触发 stat 系统调用。
✅ 启用并调优 open_file_cache 的关键配置
在 http 块中添加以下配置:
open_file_cache max=5000 inactive=60s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;
-
max=5000:最多缓存 5000 个文件描述符条目 -
inactive=60s:60 秒内未被访问的条目会被自动清理 -
open_file_cache_valid 30s:每 30 秒检查一次缓存项是否仍有效(比如文件是否被删除或重命名) -
open_file_cache_min_uses 2:一个文件需被至少访问 2 次才进入缓存,避免临时或低频文件占用空间 -
open_file_cache_errors on:缓存“文件不存在”或“权限拒绝”等错误状态,避免反复尝试访问无效路径
⚠️ 注意:
open_file_cache是全局生效的,无需写在location中;它作用于所有静态文件服务逻辑(包括root/alias下的文件读取)。
✅ 配合使用更高效
- 开启
sendfile on;和tcp_nopush on;,让内核直接传输文件,跳过用户态拷贝 - 确保
location块中对静态资源启用expires和Cache-Control,把缓存压力分摊到客户端 - 若使用
try_files或alias,也要注意路径合法性——缓存只对真实存在的文件生效,错误路径会触发open_file_cache_errors记录
✅ 验证是否生效
可通过 Nginx 内置变量 $open_file_cache_hits 和 $open_file_cache_misses 统计命中率(需配合日志格式自定义):
log_format cache_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'cache_hit:$upstream_cache_status '
'ofc_hit:$open_file_cache_hits ofc_miss:$open_file_cache_misses';
access_log /var/log/nginx/static_access.log cache_log;
观察日志中 ofc_hit 与 ofc_miss 的比例,理想情况下应远高于 1:1(例如 10:1),说明缓存正在有效减少系统开销。
不复杂但容易忽略











