必须配齐四项参数才能生效:open_file_cache max=10000 inactive=60s、open_file_cache_valid 60s、open_file_cache_min_uses 2、open_file_cache_errors on,它缓存小静态文件的元数据和fd而非内容,显著减少open()/stat()调用及磁盘io。

在 nginx.conf 的 http 块中配置 open_file_cache,核心目标是减少对小静态文件(如 index.html、favicon.ico、.js、.css)反复执行 open() 和 stat() 系统调用带来的磁盘 I/O 与 CPU 开销。它不缓存文件内容,而是缓存文件是否存在、大小、修改时间、权限、文件描述符(fd)甚至错误结果,从而显著提升高频访问场景下的响应速度和并发能力。
必须配齐的四个基础指令
只写 open_file_cache on; 完全无效。以下四项需同时出现在 http 块中:
-
open_file_cache max=10000 inactive=60s;:设置缓存容量上限为 10000 条;若某文件 60 秒内未被再次请求,则标记为非活跃,等待淘汰 -
open_file_cache_valid 60s;:每 60 秒主动校验一次缓存条目,检查文件是否被删除、重命名或权限变更 -
open_file_cache_min_uses 2;:同一文件需在inactive时间窗口内被至少请求 2 次,才进入缓存——避免偶然路径污染缓存空间 -
open_file_cache_errors on;:将 “文件不存在(ENOENT)”“无权限(EACCES)” 等错误结果也缓存,防止恶意扫描或误配路径反复触发系统调用
它只对静态文件生效
该机制仅作用于通过 root 或 alias 明确指向真实磁盘路径的静态响应,例如:
-
location /static/ { root /var/www; }→ 缓存/var/www/static/app.js -
location = /favicon.ico { alias /var/www/favicon.ico; }→ 缓存该图标文件
动态内容(如 proxy_pass、fastcgi_pass、PHP 脚本)完全不参与此缓存。Nginx 不感知文件内容变更,但 open_file_cache_valid 校验会发现 mtime 变化并自动更新元数据。
搭配使用才能释放全部效能
单独启用已有明显收益,但建议同步优化:
- 确保
sendfile on;:让内核直接传输文件内容,绕过用户态拷贝,与open_file_cache协同效果最佳 - 静态资源
location使用前缀匹配(如location /assets/),避免正则表达式增加解析开销 - 关闭无关日志:
access_log off; log_not_found off;,减少磁盘写入干扰 - 检查并提高系统限制:
worker_rlimit_nofile 65535;,否则缓存再多句柄也无法真正打开
验证是否真正起效
不能只依赖语法测试(nginx -t),需观察运行时行为:
- 用
lsof -p $(cat /var/run/nginx.pid) | wc -l对比开启前后稳定态的打开文件数,下降 20%+ 是典型生效信号 - 通过
strace -e trace=open,stat -p $(pgrep nginx)观察系统调用频次是否明显降低 - 若启用了监控插件(如 Prometheus Exporter),可追踪
ngx_http_open_file_cache_hits和_misses计数器变化趋势











