必须在http块中同时配置五项参数才能启用open_file_cache:open_file_cache max=10000 inactive=60s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; open_file_cache_events off; 它缓存文件元数据和fd,跳过stat()和open()调用。

直接在 http 块中写全五项参数,才能真正启用 open_file_cache——它不缓存文件内容,只缓存“文件是否存在”“大小多少”“最后修改时间”“权限是否允许”以及打开的文件描述符(fd),从而跳过 stat() 和 open() 系统调用,降低磁盘元数据访问压力。
必须配齐的五个核心参数
单独写 open_file_cache on 或只设 max 是无效的。以下五项需同时出现在 http 块内:
- open_file_cache max=10000 inactive=60s;:最多缓存 1 万个文件条目;60 秒内未被再次访问的条目自动清理(按 LRU 淘汰)
- open_file_cache_valid 30s;:每 30 秒主动检查一次缓存项是否仍有效(比如文件是否被删、重命名或权限变更)
-
open_file_cache_min_uses 2;:同一文件在
inactive时间窗口内至少被访问 2 次才进入缓存,避免冷路径或扫描请求污染缓存 - open_file_cache_errors on;:把 404、403 等错误结果也缓存住,防止恶意探测反复触发系统调用
-
open_file_cache_events off;(可选但推荐明确关闭):默认不启用 inotify 监听,避免因系统 inotify 限制(如
/proc/sys/fs/inotify/max_user_watches不足)导致警告
配置位置与作用范围
所有参数都必须放在 http 块中,不能写在 server 或 location 里——它是全局生效的,覆盖所有静态文件服务逻辑(包括 root、alias、try_files 背后的文件读取)。location 块里写 open_file_cache off 会禁用该作用域,但一般不需要也不推荐这么做。
配套调优建议
让缓存真正复用 fd,还需注意底层配合:
- 确保
worker_rlimit_nofile≥ 65535,否则缓存再多 fd 也无法实际打开 - 搭配
sendfile on;和tcp_nopush on;,让内核直接传输文件,跳过用户态拷贝 - 对静态资源 location 同时设置
expires或Cache-Control,把缓存压力分摊到客户端 - 若站点以小文件为主(如图标、JS/CSS、健康检查路径),
max可设为 50000~200000;若文件总量少且更新频繁,inactive可缩短至 20~30 秒,valid对应设为 10~20 秒
验证是否生效
可通过内置变量统计命中率,在 log_format 中加入:
cache_hit:$upstream_cache_status ofc_hit:$open_file_cache_hits ofc_miss:$open_file_cache_misses
观察日志中 ofc_hit 占比持续高于 80%,说明缓存已稳定起效。











