$upstream_cache_last_modified 是 Nginx Plus 内置变量,记录上游响应头中 Last-Modified 时间戳,仅在 proxy_cache 启用且后端返回有效该头时可用,属单次快照值,需结合 $upstream_cache_status 和日志分析源站更新频次。

$upstream_cache_last_modified 是 Nginx Plus(非开源版 Nginx)中用于缓存控制的内置变量,它记录的是上游服务器响应头中 Last-Modified 的值(即源站资源最后一次修改的时间戳)。该变量**不能直接用于监控更新频次**,但可作为辅助信号,结合日志与分析手段间接反映源站资源变更节奏。
理解变量的实际作用范围
该变量仅在启用 proxy_cache 且后端返回了有效的 Last-Modified 响应头时才有值;若后端未返回、返回格式非法、或缓存未命中(如首次请求),该变量为空或不可用。它不主动轮询源站,也不记录历史变更,只是“快照式”地保存某次缓存响应所携带的时间戳。
通过访问日志提取变更信号
将变量写入自定义日志格式,便于后续统计:
log_format cache_mod_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$upstream_cache_last_modified;然后在日志中观察同一 URI 对应的 $upstream_cache_last_modified 值是否随时间变化:
- 若某资源的该字段长期不变,说明源站对应文件未被修改(或未触发响应头更新)
- 若频繁出现不同值(如每小时都变),可能表示源站内容动态生成或定时刷新
- 注意排除因时区、精度(秒级)、NTP 同步偏差导致的微小差异误判
配合缓存命中状态做有效判断
单独看 Last-Modified 值易误读,需结合 $upstream_cache_status 区分真实更新和缓存复用:
-
HIT时的$upstream_cache_last_modified来自本地缓存副本,不能代表源站当前状态 - 只有
MISS或EXPIRED且成功回源后获取到的新值,才反映源站最新修改时间 - 建议在日志中同时记录
$upstream_cache_status和该变量,过滤出真实回源事件再统计
替代方案:更可靠的更新频次监控方式
若目标是准确掌握源站资源更新频率,推荐以下方法:
- 在源站侧增加轻量 API(如
/health/last-update?path=/a/b/c),直接暴露资源修改时间 - 使用 Nginx Plus 的
keyval模块或外部数据库,将回源获取的Last-Modified值按 URI 存储并打时间戳,定期比对 - 对静态资源启用
ETag+If-None-Match配合日志,通过304响应比例反推稳定性 - 绕过 Nginx,在源站部署文件监听服务(如 inotify),推送变更事件至监控系统


















