open_file_cache需与max、inactive、valid、min_uses、errors五参数共存才生效;缺一不可,否则缓存不工作。max设文件条目上限,inactive定义非活跃阈值,valid控制校验频率,min_uses防爬虫污染,errors缓存错误响应;还需同步调高系统及Nginx的fd限制,并置于http/server块中。

open_file_cache 不是开个开关就生效的
单独写 open_file_cache on; 完全无效。它必须和 max、inactive、open_file_cache_valid、open_file_cache_min_uses、open_file_cache_errors 这五项参数一起出现,缺一不可。Nginx 启动时不会报错,但缓存压根不工作——你看到的 Too many open files 或高频 stat() 调用依然存在。
五个参数各自干啥、怎么设才合理
它们不是随便凑数的,每项都对应一个具体行为边界:
-
max=10000:最多缓存 1 万个文件条目。按你静态资源总量预估,比如 5k 图片 + 2k JS/CSS + 其他,1 万是较稳妥起点;超了会按 LRU 清理最久未用的 -
inactive=60s:某文件 60 秒内没被再次访问,就标记为非活跃;注意不是立刻删,而是等下次校验时清理 -
open_file_cache_valid 30s:每 30 秒主动stat()一次缓存里的文件,检查是否被删、改名或权限变;这个值建议略短于inactive,否则失效感知滞后 -
open_file_cache_min_uses 2:同一文件在inactive时间窗口内至少被请求 2 次才进缓存;防爬虫乱扫污染缓存 -
open_file_cache_errors on:把404、403这类错误结果也缓存住;避免反复探测无效路径,白耗系统调用
光配对还不行,得让 worker 能真正用上这些 fd
缓存再好,worker 进程打不开那么多文件描述符也是白搭。必须同步调两层限制:
- 系统级:确认
/proc/sys/fs/file-max和用户级ulimit -n≥ 65535 - Nginx 级:在
http块里加worker_rlimit_nofile 65535;,否则缓存的 fd 条目再多,也卡在进程上限上 - 如果启用
open_file_cache_events on;(推荐),还得检查/proc/sys/fs/inotify/max_user_watches是否足够,建议 ≥max × 1.5,不然日志里会出现could not build optimal open_file_cache
哪些地方容易被忽略,但直接影响效果
很多人配完发现没变化,问题常出在这些细节:
-
open_file_cache必须放在http或server块里,不能塞进location—— 它是全局生效的,作用于所有root、alias、try_files解析后的实际文件路径 - 缓存的是元数据(fd、mtime、size、存在性、权限),不是文件内容;想加速传输,得配合
sendfile on;,两者才是黄金搭档 - 高频小文件(如
/favicon.ico、/static/app.js)受益最大;大文件或低频资源没必要强塞进缓存 - 挂载文件系统时加
noatime,避免每次读取都触发磁盘写入,否则open_file_cache的收益会被抵消一部分


















