核心是统一nginx节点缓存行为:显式定义proxy_cache_key剔除动态头、统一keys_zone配置、全局设置proxy_cache_valid对齐过期时间、启用cache_purge主动失效、静态资源url注入内容哈希实现长期缓存。

核心在于让每个节点的缓存行为一致、更新可控,同时避免因节点间状态不同步导致用户看到旧资源或混合版本。
统一缓存标识与键规则
负载均衡下多个 Nginx 节点若使用默认缓存键,可能因请求头微小差异(如 User-Agent、Accept-Encoding 变化)生成不同缓存副本,造成“同一 URL 多个缓存实体”,即污染。
- 显式定义 proxy_cache_key,只保留影响资源内容的变量:用
$scheme$host$request_uri或更稳妥的$scheme$host$uri$is_args$args,剔除$http_*类动态头 - 确保所有节点的 keys_zone 名称和大小完全一致,例如统一配置为
keys_zone=static_cache:50m - 禁用可能引入歧义的指令,如
proxy_cache_bypass或proxy_no_cache在静态资源 location 中随意启用
强制缓存时效对齐
各节点本地缓存过期时间不一致,会导致部分节点已刷新资源,另一些仍返回旧内容,用户随机命中后体验割裂。
- 在
http块统一设置 proxy_cache_valid,例如:proxy_cache_valid 200 301 302 1h;proxy_cache_valid 404 5m; - 配合 proxy_cache_use_stale updating,允许在后台更新缓存时继续提供旧内容,避免雪崩,但需确保更新逻辑本身是原子且幂等的
- 避免在不同 server 或 location 中对同一类资源(如 .js/.css)设置冲突的
proxy_cache_valid值
资源更新时主动失效缓存
发布新版本静态资源后,不能依赖自然过期——等待 1 小时不如立刻清理。
- 启用 cache purge 功能,在配置中加入可触发清理的 location:
location ~ /purge(/.*) {
allow 127.0.0.1;
allow 10.0.0.0/8; # 仅允许内网运维 IP
deny all;
proxy_cache_purge static_cache $1;
}- 上线脚本中调用
curl -X PURGE http://node-ip/purge/static/js/app_abc123.js,逐文件清理;或通配清理目录:/purge/static/css/ - 若使用 CDN,还需同步调用 CDN 的刷新接口,防止边缘节点缓存未同步
静态资源 URL 本身带指纹
从源头规避缓存复用问题——这是最彻底的解法,与 Nginx 缓存机制无关,但能大幅降低对缓存管理的依赖。
- 构建阶段为 CSS/JS 文件名注入内容哈希,如
app.a1b2c3.js,HTML 中引用该唯一路径 - Nginx 对这类带哈希的文件,可配置长期缓存(
max-age=31536000),因为文件内容不变则 URL 永远不变 - 搭配
expires max;和add_header Cache-Control "public, immutable";,既提升性能,又杜绝污染可能











