直接在http块中配置open_file_cache是降低index指令和静态资源访问磁盘i/o最有效的方式,它缓存文件存在性、目录类型、修改时间等stat()元数据,需配齐max、inactive、valid、min_uses和errors五项参数,并配合前缀匹配location、关闭日志及调高系统文件描述符限制协同优化。

直接在 http 块中配置 open_file_cache 是降低 index 指令和静态资源访问磁盘 I/O 最有效的方式。它缓存的是文件是否存在、是否为目录、最后修改时间等元数据(即 stat() 结果),避免每次请求都触发系统调用。
核心参数要配全
只写 open_file_cache 一行是不够的,必须搭配验证、准入和错误处理机制:
-
open_file_cache max=10000 inactive=60s;—— 缓存最多 1 万个文件条目;60 秒内未被再次访问就自动剔除 -
open_file_cache_valid 30s;—— 每隔 30 秒主动校验一次缓存项是否仍有效(重新 stat) -
open_file_cache_min_uses 2;—— 同一文件在inactive时间窗内至少被访问 2 次才进缓存,防爬虫污染 -
open_file_cache_errors on;—— 把404、403等错误结果也缓存,避免反复查询不存在路径
参数值怎么选
不是越大越好,得看你的静态资源规模和并发特征:
- 如果站点有约 5k 图片 + 2k JS/CSS + 其他资源,
max=10000已够用;高并发小文件场景可提到20000 -
inactive设太长(如几小时)会导致已删文件的 404 延迟返回;设太短(如 10s)则缓存命中率低 -
valid应略小于inactive,比如inactive=60s就配valid=30s,确保失效感知及时
配合其他优化效果更明显
单靠 open_file_cache 不够,需同步减少不必要的系统开销:
- 静态资源 location 用前缀匹配(如
location /static/),别用正则,省掉运行时路径解析 - 纯静态节点关闭日志:
access_log off;,避免磁盘写入拖慢响应 - 确认系统级文件描述符上限足够:用
ulimit -n查看,建议设为65535或更高
验证是否生效
改完配置 reload 后,可通过以下方式观察效果:
- 监控
iostat -x 1中的%util和await,I/O 压力应明显下降 - 用
strace -p $(pgrep nginx) -e trace=open,stat抽样抓取 worker 进程系统调用,open/stat 次数应大幅减少 - 查看 Nginx 错误日志,若频繁出现
Too many open files,说明ulimit或worker_rlimit_nofile需调整











