需在log_format中添加$upstream_cache_status变量并启用proxy_cache,其输出hit/miss/expired/bypass/stale/revalidated/updating等状态,用于精准分析缓存行为与命中率。

Nginx 可以通过内置变量 $upstream_cache_status 在 access_log 中记录缓存命中状态,这是分析缓存效率最直接的方式。
确认缓存配置已启用
该变量只有在配置了 proxy_cache 或 fastcgi_cache 等缓存机制后才有值。确保你的 server 或 location 块中包含类似以下配置:
- 定义缓存区域:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off; - 启用缓存:
proxy_cache my_cache; - 设置缓存键(可选但推荐):
proxy_cache_key "$scheme$request_method$host$request_uri"; - 指定哪些响应可缓存:
proxy_cache_valid 200 302 10m;
在 log_format 中加入缓存状态变量
修改或新增一个 log_format,把 $upstream_cache_status 加入其中。它会输出以下常见值:
- HIT:响应直接从缓存返回
- MISS:未命中缓存,请求转发给后端
- EXPIRED:缓存存在但已过期,仍需回源(但可能带 If-Modified-Since 等协商)
- STALE:缓存过期但配置了 proxy_cache_use_stale,仍返回旧内容
- BYPASS:因 proxy_cache_bypass 指令跳过缓存
- REVALIDATE:缓存有效但触发了 proxy_cache_revalidate
- UPDATING:缓存正在更新(配合 proxy_cache_use_stale updating)
示例 log_format:
log_format cache_log '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$upstream_cache_status';将自定义日志格式应用到 server 或 location
在需要监控缓存的上下文中使用 access_log 指令引用该格式:
注意:如果同时使用多个日志格式,确保没有冲突;建议为缓存分析单独配置一个日志文件,便于后续用 awk/grep/Logstash 等工具统计 HIT 率。
验证与简单分析
重启 Nginx 后发起几次请求(如 curl 多次访问同一资源),然后查看日志:
tail -f /var/log/nginx/cache_access.log你会看到类似这样的行:
127.0.0.1 - - [10/Jan/2024:15:22:33 +0800] "GET /api/data HTTP/1.1" 200 123 "-" "curl/7.68.0" HIT快速统计命中率可用:
awk '{print $13}' /var/log/nginx/cache_access.log | sort | uniq -c | sort -nr结果中 HIT 行占比越高,说明缓存利用率越好;若大量 MISS 或 EXPIRED,需检查缓存 key、有效期、请求头(如 Cookie、Authorization)是否意外导致缓存失效。











