nginx旧缓存平滑过渡机制验证核心是故障下仍返回stale缓存并后台静默更新:响应应为200且x-cache-status: stale,内容一致、延迟毫秒级;后台更新完成后二次请求应命中hit,并在error日志中见“cache updated in background”提示。

测试旧版本缓存的平滑过渡机制,核心是验证当新内容不可用时,Nginx 是否能稳定、低延迟地返回可用的旧缓存,并在后台静默更新——不是看“有没有缓存”,而是看“故障下是否仍可用、是否无缝更新”。
模拟后端失效并观察响应行为
这是最直接的验证方式。停掉 upstream 服务(如 kill -9 后端进程或临时注释 proxy_pass),然后发起请求:
- 响应状态码应为 200(或原缓存对应的状态码),而非 502/504
- 响应头中必须出现 X-Cache-Status: STALE(需提前配置
add_header X-Cache-Status $upstream_cache_status;) - 响应体内容与故障前完全一致(可比对 md5 或关键字段),不能是空页、默认错误页或结构错乱的 JSON
- 响应耗时应在毫秒级(如 20–80ms),远低于
proxy_read_timeout(例如设为 5s),说明未等待后端
确认陈旧缓存被实际复用且后台已刷新
STALE 状态只是起点,真正体现“平滑”的是后台是否同步拉取新内容:
- 开启
proxy_cache_background_update on;后,在后端恢复前再次请求同一 URL,应看到第二次响应头变为 HIT(说明后台刷新已完成) - 检查 Nginx error 日志:
tail -f /var/log/nginx/error.log,应有类似cache updated in background的提示(需开启 debug 日志级别可更清晰) - 若配合
proxy_cache_lock on;,高并发下首次 STALE 返回后,后续请求应快速 HIT,而非大量 MISS 或重复回源
验证缓存键一致性与内容隔离
若迁移中存在新旧版本共存(如灰度发布),需确保不同版本缓存不互相覆盖:
- 检查
proxy_cache_key是否包含可区分版本的变量,例如"$host$request_uri$arg_v"或"$scheme$host$request_uri$is_args$args" - 分别带
?v=1和?v=2请求同一接口,确认两者缓存独立:一个失效不影响另一个,且各自 STALE 行为互不干扰 - 用
find /var/cache/nginx -type f -name "*<hash_of_v1>*"</hash_of_v1>和*<hash_of_v2>*</hash_of_v2>查看物理文件是否分离
结合日志统计命中率变化趋势
单次测试易受干扰,长期可观测性才能确认机制稳定生效:
- 在 access_log 中添加
log_format cache '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_cache_status"'; - 用脚本按小时统计
X-Cache-Status: STALE占比,上线后若后端偶发抖动,该比例应短暂上升后回落,且无 5xx 增加 - 对比故障窗口内 HIT/MISS/STALE 三者比例:STALE 显著上升 + HIT 次数同步补位 → 表明平滑过渡机制起效











