$upstream_cache_last_modified 是 Nginx 在 proxy_cache_revalidate 成功收到 304 时记录的缓存保鲜时间戳(RFC 1123 格式),仅 REVALIDATED 状态下有效,用于运维分析内容静止性、revalidate 有效性及保鲜周期。

$upstream_cache_last_modified 是 Nginx 内置变量,仅在启用 proxy_cache_revalidate 且缓存条目被成功 revalidated(即收到 304)时才有值——它记录的是该缓存条目**最后一次从后端确认有效的时间戳**(格式为 RFC 1123,如 Wed, 01 Jan 2025 00:00:00 GMT),而非原始响应中的 Last-Modified 头。
它能帮你定位哪些实际问题
这个变量不直接参与缓存逻辑,但对运维分析非常实用:
- 判断内容是否真的“静止”:如果大量缓存的
$upstream_cache_last_modified集中在某几个时间点(比如每天凌晨 2 点),说明后端可能定时刷新资源,但前端缓存未同步更新策略 - 识别无效 revalidate:若日志中出现
REVALIDATED状态,但该变量为空或格式异常,说明后端未返回标准Last-Modified或ETag,revalidate 实际未生效 - 估算平均保鲜周期:提取该变量与当前请求时间差,可统计某类资源(如 /api/v1/config)平均多久被校验一次,辅助调整
inactive和max_size
如何在日志中稳定采集该变量
需确保两点:一是启用 revalidate,二是让变量进入 access_log。推荐配置如下:
log_format cache_detail '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_cache_status $upstream_cache_last_modified '
'$upstream_response_time';
access_log /var/log/nginx/cache.log cache_detail;
注意:$upstream_cache_last_modified 在 HIT、MISS、EXPIRED 等状态下恒为空字符串,只在 REVALIDATED 时有值。日志中看到 - 或空字段是正常现象。
结合其他变量做带宽压力归因
单看时间戳不够,要和带宽行为关联。例如:
- 当
$upstream_cache_status = REVALIDATED且$upstream_response_length → 表明成功走 304 节省了主体传输,属健康状态 - 同为
REVALIDATED,但$upstream_response_length > 10000→ 实际返回了完整 200,说明后端未正确支持协商缓存,revalidate 失效,却仍触发了回源 - 对比
$upstream_cache_last_modified和$upstream_http_last_modified:前者是 Nginx 记录的“保鲜时间”,后者是后端响应头原始值;若两者长期不一致,可能是后端时钟不同步或响应头被中间层篡改
用简单脚本快速统计更新节奏
比如用 awk 抽取最近一小时地图瓦片的保鲜分布:
awk '$7 == "REVALIDATED" && $8 != "-" {print $8}' /var/log/nginx/cache.log | \
awk -F' ' '{print $2,$3,$4}' | sort | uniq -c | sort -nr
输出类似:
127 Jan 01 202593 Feb 15 2025
5 Apr 22 2025
说明绝大多数瓦片最后一次保鲜发生在年初,近期几乎没变化——此时可考虑延长 proxy_cache_valid,减少不必要的 revalidate 触发。


















