open_file_cache_errors 用于缓存“文件不存在”等错误结果,使后续相同请求直接返回404/403,跳过磁盘查询;必须配合 open_file_cache 及其相关指令(如 max、inactive、valid、min_uses)共同生效,单独启用无效。

open_file_cache_errors 的作用不是“记录”错误,而是把“文件不存在”“权限拒绝”这类失败结果缓存起来,让后续相同请求直接返回 404 或 403,跳过真实的磁盘查询和系统调用。
必须配合 open_file_cache 才能生效
单独写 open_file_cache_errors on; 没有效果。它只是 open_file_cache 机制的一部分,依赖以下基础配置共同存在:
-
open_file_cache max=1000 inactive=60s;—— 提供缓存容器和淘汰规则 -
open_file_cache_valid 30s;—— 控制错误结果的缓存有效期(比如 404 缓存 30 秒后重新检查) -
open_file_cache_min_uses 2;—— 对错误路径也适用:同一 404 路径需在 inactive 周期内重复出现至少 2 次才进入缓存
典型配置示例(适用于静态资源服务)
放在 http 或 server 块中即可:
open_file_cache max=2000 inactive=30s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on;
说明:
- 高频探测的健康检查路径(如
/healthz)或固定不存在的旧资源路径(如/old-api.js),会快速满足min_uses=2条件,被缓存为 404 -
valid=30s意味着即使文件后来被创建,最多等待 30 秒就能命中新状态,兼顾性能与一致性 - 不建议设
valid过长(如 >120s),否则可能长期返回过期的 404,影响上线调试
验证是否起效
它不会写日志,但可通过系统行为观察:
- 用
perf stat -e syscalls:sys_enter_openat,syscalls:sys_enter_statx -p $(pgrep nginx)压测同一 404 路径,开启前后对比系统调用次数应明显下降 - 用
lsof -p $(pgrep nginx) | grep "No such file"查不到结果是正常现象——说明 Nginx 已跳过真实打开,直接返回缓存错误 - 临时关闭
open_file_cache_errors并开启error_log /path/to/log debug;,可看到大量open() "/xxx" failed (2: No such file or directory)日志;开启后这类日志会大幅减少
注意事项
这个功能适合稳定路径结构的生产环境,但要注意:
- 它会掩盖临时性问题,比如刚上传文件但缓存还没刷新,用户仍看到 404
- 若业务中存在大量动态生成路径或灰度发布场景,建议在对应
location块中禁用:open_file_cache_errors off; - 错误缓存的生命周期由
open_file_cache_valid统一控制,没有独立超时参数










