nginx http代理缓存更新策略核心是平衡稳定性与及时性,通过分层设置缓存有效期、启用后台更新与容错、支持请求头主动刷新、忽略干扰响应头四方面实现。

Nginx 的 HTTP 代理缓存更新策略,核心不是“一改即刷”,而是让缓存既能稳定服务用户,又能及时反映后端变化。关键在于控制何时过期、如何回源、能否绕过、是否容错四个环节。
缓存有效期要分层设置
不同响应状态和业务场景,应设不同缓存时长,避免一刀切:
- 正常内容(200/302):
proxy_cache_valid 200 302 5m;—— 高频但可容忍短时旧数据 - 错误兜底页(404/503):
proxy_cache_valid 404 503 1m;—— 避免反复探活压垮后端 - 明确不缓存的接口(如登录态操作):
proxy_cache_valid any 0s;或直接跳过proxy_cache指令
启用后台更新 + 容错返回
默认缓存过期后,所有请求会阻塞等待回源。开启后台更新后,Nginx 会:
- 立即返回旧缓存(保证可用性)
- 同时异步拉取新内容并更新缓存
只需加一行:proxy_cache_background_update on;
再搭配容错指令,让网络抖动或后端短暂不可用时仍能返回旧内容:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
提供主动刷新能力(运维/发布触发)
上线新内容后,需要立刻生效?靠时间过期太慢。可通过请求头触发绕过缓存并强制更新:
在 location 块中添加:
proxy_cache_bypass $http_x_cache_bypass; proxy_no_cache $http_x_cache_bypass;
然后用 curl 发送带标记的请求:
curl -H "X-Cache-Bypass: 1" https://example.com/api/data
该次请求不读缓存、不写缓存;后续普通请求将命中刚生成的新响应。
忽略干扰响应头,防止缓存被禁用
后端常返回 Cache-Control: no-cache 或 Set-Cookie,Nginx 默认会因此拒绝缓存。若你确认该动态内容适合缓存(比如带 token 的只读 API),需显式忽略:
proxy_ignore_headers Cache-Control Expires Set-Cookie;
注意:Set-Cookie 被忽略后,Nginx 才可能缓存含用户态的响应;但务必确保该响应本身不包含敏感或个性化强的数据。
不复杂但容易忽略











