需在Nginx中启用proxy_cache等缓存模块并配置有效缓存区与指令,再通过log_format包含$upstream_cache_status变量记录缓存状态(如HIT、MISS等),最后基于日志统计命中率。

要在 Nginx 访问日志中全量审计缓存命中率,核心是利用 log_format 指令将缓存状态(如 $upstream_cache_status)纳入日志字段,并确保后端或代理配置实际启用了缓存。仅定义日志格式不启用缓存,该变量始终为空或 -,无法统计命中率。
确认缓存已启用并可被记录
$upstream_cache_status 是 Nginx 内置变量,仅在使用 proxy_cache、fastcgi_cache 等缓存模块且请求真正经过缓存路径时才有有效值(如 HIT、MISS、EXPIRED、BYPASS 等)。需检查以下两点:
- 已在
http或location块中配置了有效的缓存区(如proxy_cache my_cache)和缓存指令(如proxy_cache_valid 200 10m) - 请求未被显式绕过缓存(例如没有带
Cache-Control: no-cache、未匹配proxy_cache_bypass条件、未触发proxy_no_cache)
定义含缓存状态的 log_format
在 http 块中自定义日志格式,显式包含 $upstream_cache_status,并建议同时加入响应时间与上游地址便于交叉分析:
log_format cache_audit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$upstream_cache_status $upstream_addr';然后在 access_log 中引用该格式:
access_log /var/log/nginx/access.log cache_audit;
验证日志输出与命中状态含义
重启 Nginx 后发起多次请求(含首次访问和重复访问),观察日志中 $upstream_cache_status 字段值。常见取值含义如下:
- HIT:响应直接来自本地缓存,未转发给上游
- MISS:缓存中无可用副本,已转发请求至上游并缓存了响应
- EXPIRED:缓存存在但已过期,已转发请求并刷新缓存
-
STALE:返回了过期缓存(因配置了
proxy_cache_use_stale) -
BYPASS:请求被
proxy_cache_bypass规则跳过缓存(如带特定 cookie) -
REVALIDATED:使用
If-Modified-Since/If-None-Match验证后确认缓存仍新鲜 - -:未启用缓存、未匹配缓存 location、或非 proxy 场景(如静态文件直出)
基于日志计算缓存命中率
通过日志分析脚本(如 awk、logstash 或 Prometheus + nginxlog exporter)按时间窗口聚合统计。例如用 awk 快速估算 1 小时内命中率:
awk '$12 ~ /^(HIT|REVALIDATED|STALE)$/ {hit++}
$12 != "-" {total++}
END {printf "Hit Rate: %.2f%\n", hit/total*100}' /var/log/nginx/access.log注意:生产环境建议过滤掉健康检查、爬虫、非业务路径等干扰流量,再按接口或 upstream 分组统计,才能反映真实业务缓存效率。


















