确保动态内容缓存一致性需聚焦“不陈旧、不冲突、不敏感”,通过稳定缓存键(剔除cookie/authorization等干扰项、归一化参数)、主动purge失效、stale+background更新、缓存锁及敏感接口绕过实现。

处理后端动态生成内容的缓存一致性,核心不是让所有 Nginx 节点缓存完全一样,而是确保用户看到的数据“不陈旧、不冲突、不敏感”,同时避免回源压力突增。动态内容天然难缓存,但通过合理分层、精准键控和主动协同,完全可以做到业务可接受的一致性。
统一且稳定的缓存键
动态接口(如 /api/user/profile 或 /dashboard?tab=stats)若缓存键含易变字段,就会产生大量冗余副本甚至缓存污染。必须剔除干扰项:
- 默认禁用 $cookie_xxx、$http_authorization 等变量——除非明确需要按用户隔离;如确需鉴权缓存,应透传并纳入 key:proxy_set_header Authorization $http_authorization;,再写入 proxy_cache_key "$scheme$host$request_uri$http_authorization";
- 过滤无意义参数:用 map 指令归一化 $args,例如剔除 utm_*、_t= 类跟踪参数,再参与哈希
- 推荐基础键:proxy_cache_key "$scheme$host$request_uri"; ——覆盖协议、域名、完整路径与参数,兼顾通用性与稳定性
发布即失效,不等 TTL 到期
动态内容更新(如运营配置变更、用户权限调整)不能靠 5 分钟或 10 分钟过期被动清理。必须由发布系统触发主动清除:
- 启用 ngx_http_proxy_cache_purge 模块(编译时加入或宝塔插件安装)
- 配置安全的 purge 接口:location ~ /purge(/.*) { allow 10.0.0.0/8; deny all; proxy_cache_purge my_cache $scheme://$host$1; }
- 部署完成后执行:curl -X PURGE https://edge-node/purge/api/config,失败需告警重试
容忍短时旧数据,但要平滑回源
对无法 URL 版本化的动态接口,关键不是“绝对实时”,而是“不卡顿、不雪崩”:
- 设置合理有效期:proxy_cache_valid 200 302 120s;(根据业务更新节奏调整,常见为 60–300 秒)
- 启用 stale + background update:proxy_cache_use_stale http_500 http_502 http_503 http_504 updating; 和 proxy_cache_background_update on;,保证缓存过期后仍可返回旧内容,同时后台静默刷新
- 开启缓存锁:proxy_cache_lock on; + proxy_cache_lock_age 5s;,防止高并发下多个请求同时回源
敏感操作坚决不缓存
不是所有动态响应都适合缓存。以下场景应显式绕过:
- 支付、订单提交、密码修改等操作接口:proxy_no_cache $http_pragma $http_authorization; + proxy_cache_bypass $http_pragma $http_authorization;
- 含 Set-Cookie 头的响应(Nginx 默认不缓存,但需确认未被覆盖)
- 后端明确返回 Cache-Control: no-store 或 private 时,建议启用 proxy_ignore_headers Cache-Control 的反向控制(即尊重后端指令)











