要记录 Nginx 代理缓存命中状态,需使用变量 $upstream_cache_status,配合 proxy_cache 配置及 log_format 中加入该变量;常见状态包括 HIT、MISS、EXPIRED、BYPASS、STALE、UPDATING 等,分别表示缓存命中、未命中、过期、跳过、过期仍用、后台更新等行为。

在 Nginx 代理缓存中,要记录缓存命中状态(HIT、MISS、EXPIRED、BYPASS 等),需使用内置变量 $upstream_cache_status。
启用并配置缓存区域
确保已正确定义了 proxy_cache,并在 location 中启用缓存:
- 在
http块中定义缓存区,例如:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m use_temp_path=off; - 在
location或server块中启用缓存:proxy_cache mycache;<br>proxy_cache_valid 200 302 10m;<br>proxy_cache_valid 404 1m;
在 log_format 中加入 $upstream_cache_status
该变量会在每次请求结束后被填充为缓存状态,仅在启用 proxy_cache 后有效。示例日志格式:
- 在
http块中定义:log_format cache '[$time_local] "$request" $status $body_bytes_sent "<br> $http_referer" "$http_user_agent" "$upstream_cache_status" $request_time $upstream_response_time';
- 然后在
access_log中引用:access_log /var/log/nginx/access.log cache;
日志行末尾将出现类似 HIT、MISS、EXPIRED、BYPASS、STALE、UPDATING、REVALIDATED 等值。
常见状态含义说明
理解这些值有助于排查缓存行为:
- HIT:响应直接从缓存返回,未向后端发起请求
- MISS:缓存中无可用副本,Nginx 向后端请求并缓存响应
- EXPIRED:缓存存在但已过期,Nginx 向后端验证或重新获取
-
BYPASS:因
proxy_cache_bypass指令跳过缓存(如带特定 cookie 或参数) -
STALE:缓存已过期,但配置了
proxy_cache_use_stale,仍返回旧内容 -
UPDATING:缓存已过期,正在后台更新,当前返回旧内容(需配合
proxy_cache_use_stale updating)
注意事项
避免常见配置疏漏:
-
$upstream_cache_status是“上游”变量,必须搭配proxy_pass使用;不走代理的静态文件请求中该值为空 - 若日志中始终显示破折号
-,检查是否漏配proxy_cache或该请求未命中启用缓存的 location - 调试时可临时加
add_header X-Cache-Status $upstream_cache_status;在响应头中验证 - 注意区分
$upstream_cache_status(缓存动作结果)和$sent_http_x_cache(手动设置的响应头)


















