error_log不控制缓存逻辑,但能揭示缓存失效的异常信号,如后端响应头禁止缓存、缓存目录权限不足、proxy_cache_bypass条件错误等,并需结合access_log中的$upstream_cache_status才能准确定位问题根因。

error_log 本身不参与静态文件缓存逻辑,也不直接影响缓存命中率。它不决定是否缓存、如何缓存或缓存是否生效——这些全由 proxy_cache、expires、Cache-Control 等指令控制。
但它能帮你发现缓存失效的“异常信号”
当缓存行为与预期不符时,error_log 常记录底层干扰因素,这些因素虽不直接写在缓存配置里,却会悄悄破坏缓存效果:
- 后端返回了
Set-Cookie或Cache-Control: no-store,Nginx 默认会跳过缓存(即使配置了proxy_cache),这类决策会在error_log中以upstream sent no cacheable response或类似提示出现 - 缓存路径磁盘满、权限不足、目录不可写时,Nginx 无法写入缓存文件,日志中会出现
cache file .* is not found或open() "/var/cache/nginx/..." failed (13: Permission denied) - 使用
proxy_cache_bypass或proxy_no_cache时,若条件表达式出错(如变量未定义、语法错误),Nginx 可能静默失败,error_log会输出invalid condition类警告
配合 access_log 才能准确定位缓存问题
单看 error_log 只能看到“失败”,但看不到“谁失败、为什么失败”。必须结合带 $upstream_cache_status 的 access_log:
- 如果
access_log显示大量BYPASS,而error_log无相关报错 → 说明是业务规则主动绕过(如带 Cookie 请求),不是系统级故障 - 如果
access_log显示大量MISS,同时error_log出现upstream sent no cacheable response→ 指向后端响应头污染,需加proxy_ignore_headers Cache-Control Set-Cookie - 如果
access_log中缓存状态正常(HIT 占比高),但用户仍感知慢 → 查error_log是否有upstream timed out,可能后端响应慢拖累整体体验
优化 error_log 配置提升排查效率
让 error_log 在缓存调优中真正有用,关键不是记录更多,而是记录更准、更稳:
- 级别设为
warn:避免info或debug级别淹没真实问题;error级别又太粗略,会漏掉关键警告 - 确保日志路径可写且磁盘充足:缓存目录和日志目录不能共用同一分区,否则缓存写失败时日志也可能写不进去
- 不建议关闭
error_log:哪怕只记录 warn 及以上,它仍是判断缓存机制是否“健康运行”的底线依据











