最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中静态资源缓存如何在 CDN 加速节点配置中正确配合源站缓存策略
时间:2026-08-30 20:40:50 编辑:袖梨 来源:一聚教程网
CDN与Nginx缓存需分层协同:CDN管静态资源广度分发,Nginx管动态内容精度控制;缓存键、HTTP头、回源上下文及本地兜底策略须严格对齐。
关键在于分层明确、头信息对齐、缓存键不冲突。CDN 是广度分发,Nginx 是精度控制;两者不是叠加快,而是各管一段。
一、缓存职责必须清晰划分
CDN 负责缓存无状态、高复用的静态资源(如 .js/.css/.png/.woff2),节点离用户近,但策略粗、不可定制上下文;Nginx 则聚焦带业务逻辑的内容——比如含 Cookie 的登录页、按语言返回的 HTML、带查询参数的 API 结果。
- CDN 应关闭对 /api/、/user/、/admin/ 等路径的缓存,或统一设 TTL=1s,交由 Nginx 决策
- Nginx 的 proxy_cache_key 必须包含 $http_cookie 和 $http_accept_language,确保不同用户看到各自版本,不混用缓存
- 为防 CDN 和 Nginx 同时缓存同一请求,可在 CDN 回源时加自定义头(如 X-From-CDN: true),Nginx 中用 set $skip_cache "1" 跳过本地缓存
二、HTTP 缓存头要协同生效
CDN 是否缓存、缓多久,完全依赖 Nginx 响应头中的 Cache-Control。它必须明确、不被覆盖,且与资源更新节奏匹配。
- JS/CSS/字体:设 Cache-Control: public, immutable, max-age=31536000(1 年),构建时加哈希后缀,更新即换 URL
- 图片/图标:设 max-age=604800(1 周),兼顾更新灵活性与边缘命中率
- HTML/首页:设 max-age=60(1 分钟)或 no-cache,避免 CDN 缓存动态内容
- Nginx 配置中禁用 proxy_ignore_headers Cache-Control Expires,防止源站头被丢弃
三、Nginx 本地缓存需兜底 + 防穿透
即使 CDN 承担了大部分流量,Nginx 的缓存仍是最后一道防线——尤其当 CDN 回源失败、或用户直连源站时。
- 用 proxy_cache_path 定义独立缓存区,例如:
/var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:100m max_size=5g inactive=60m
- inactive=60m 比仅靠 max-age 更可靠:哪怕源站没返回过期头,60 分钟未访问的缓存也会自动清理
- 启用 proxy_cache_lock on 防止缓存失效瞬间大量请求穿透(缓存击穿),并设 proxy_cache_lock_timeout 3s 避免阻塞
- 搭配 proxy_cache_use_stale error timeout updating http_500–504,源站异常时仍可返回旧缓存,保障可用性
四、回源链路要传递真实上下文
CDN 回源到 Nginx 时,不能只传一个 URL,否则 Nginx 无法识别用户设备、语言、地区等关键信息,导致缓存错乱或响应错误。
- 在 proxy_pass 前添加:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Accept-Language $http_accept_language;
- 若 CDN 支持自定义回源头(如 Cloudflare 的 CF-IPCountry),Nginx 可据此做地域路由或差异化缓存
- 在 Nginx 日志中记录 $upstream_cache_status,便于排查是 CDN 命中、Nginx 命中,还是彻底未缓存
相关文章
- TPLink TLWR890N 无线路由器WiFi密码和名称设置 08-30
- TPLink TLWDR7400 无线路由器当作无线交换机使用 08-30
- TPLink TLWDR7400 无线路由器网速限制方法 08-30
- web高危漏洞有哪些-权限检查和参数设置 08-30
- 浅草雷门和纸明信片提示词怎么写-画面元素和风格参数 08-30
- xxe 漏洞是的怎么解决-原因和修复方法 08-30