Nginx 后端响应超时怎么利用旧缓存进行容灾处理
在 nginx 中,当后端服务响应超时或不可用时,可以通过配置 proxy_cache 结合 proxy_cache_valid 和 proxy_cache_use_stale 指令来实现容灾。具体做法是开启缓存并设置允许使用过期(stale)缓存,这样在后端挂掉时,nginx 会直接返回本地存储的旧数据,而不是抛出 502 或 504 错误。

如何配置 proxy_cache_use_stale 以覆盖特定错误
要实现这一功能,核心在于 proxy_cache_use_stale 指令。该指令默认关闭,需要显式开启并指定在哪些情况下可以使用旧缓存。例如,设置为 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; 可以确保在后端报错、超时或返回 5xx 状态码时,Nginx 优先返回缓存中的内容。

server {
listen 80;
server_name example.com;
# 定义缓存路径和参数
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
location / {
proxy_pass http://backend_server;
# 启用缓存
proxy_cache my_cache;
# 设置缓存键
proxy_cache_key $scheme$request_method$host$request_uri;
# 关键配置:允许在错误、超时等情况下使用旧缓存
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 可选:更新缓存时是否等待新数据完成(默认为 off,即立即返回旧缓存)
proxy_cache_revalidate on;
# 设置缓存有效期
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}后端恢复后缓存如何更新与验证
当后端服务恢复后,Nginx 的行为取决于 proxy_cache_background_update 和 proxy_cache_revalidate 的设置。如果开启了背景更新,Nginx 会在返回旧缓存的同时,在后台发起请求获取最新数据并替换缓存。如果没有开启背景更新,则直到缓存过期才会重新请求。这种机制保证了用户体验的连续性,同时逐步恢复数据的实时性。

# 在 location 块中添加以下配置以实现平滑过渡
location / {
proxy_pass http://backend_server;
proxy_cache my_cache;
proxy_cache_key $scheme$request_method$host$request_uri;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
# 开启背景更新,避免高并发下同时刷新缓存导致雪崩
proxy_cache_background_update on;
# 开启 revalidate,通过 If-Modified-Since 头检查资源是否变更
proxy_cache_revalidate on;
# 设置较短的缓存时间以便快速恢复新鲜度
proxy_cache_valid 200 302 5m;
}


















