一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中静态资源缓存如何在 CDN 加速节点配置中正确配合源站缓存策略

时间:2026-08-30 20:40:50 编辑:袖梨 来源:一聚教程网

CDN与Nginx缓存需分层协同:CDN管静态资源广度分发,Nginx管动态内容精度控制;缓存键、HTTP头、回源上下文及本地兜底策略须严格对齐。

关键在于分层明确、头信息对齐、缓存键不冲突。CDN 是广度分发,Nginx 是精度控制;两者不是叠加快,而是各管一段。

一、缓存职责必须清晰划分

CDN 负责缓存无状态、高复用的静态资源(如 .js/.css/.png/.woff2),节点离用户近,但策略粗、不可定制上下文;Nginx 则聚焦带业务逻辑的内容——比如含 Cookie 的登录页、按语言返回的 HTML、带查询参数的 API 结果。

  1. CDN 应关闭对 /api/、/user/、/admin/ 等路径的缓存,或统一设 TTL=1s,交由 Nginx 决策
  2. Nginx 的 proxy_cache_key 必须包含 $http_cookie$http_accept_language,确保不同用户看到各自版本,不混用缓存
  3. 为防 CDN 和 Nginx 同时缓存同一请求,可在 CDN 回源时加自定义头(如 X-From-CDN: true),Nginx 中用 set $skip_cache "1" 跳过本地缓存

二、HTTP 缓存头要协同生效

CDN 是否缓存、缓多久,完全依赖 Nginx 响应头中的 Cache-Control。它必须明确、不被覆盖,且与资源更新节奏匹配。

  1. JS/CSS/字体:设 Cache-Control: public, immutable, max-age=31536000(1 年),构建时加哈希后缀,更新即换 URL
  2. 图片/图标:设 max-age=604800(1 周),兼顾更新灵活性与边缘命中率
  3. HTML/首页:设 max-age=60(1 分钟)或 no-cache,避免 CDN 缓存动态内容
  4. Nginx 配置中禁用 proxy_ignore_headers Cache-Control Expires,防止源站头被丢弃

三、Nginx 本地缓存需兜底 + 防穿透

即使 CDN 承担了大部分流量,Nginx 的缓存仍是最后一道防线——尤其当 CDN 回源失败、或用户直连源站时。

  1. proxy_cache_path 定义独立缓存区,例如:

    /var/cache/nginx/static_cache levels=1:2 keys_zone=static_cache:100m max_size=5g inactive=60m

  2. inactive=60m 比仅靠 max-age 更可靠:哪怕源站没返回过期头,60 分钟未访问的缓存也会自动清理
  3. 启用 proxy_cache_lock on 防止缓存失效瞬间大量请求穿透(缓存击穿),并设 proxy_cache_lock_timeout 3s 避免阻塞
  4. 搭配 proxy_cache_use_stale error timeout updating http_500–504,源站异常时仍可返回旧缓存,保障可用性

四、回源链路要传递真实上下文

CDN 回源到 Nginx 时,不能只传一个 URL,否则 Nginx 无法识别用户设备、语言、地区等关键信息,导致缓存错乱或响应错误。

  1. 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;

  2. 若 CDN 支持自定义回源头(如 Cloudflare 的 CF-IPCountry),Nginx 可据此做地域路由或差异化缓存
  3. 在 Nginx 日志中记录 $upstream_cache_status,便于排查是 CDN 命中、Nginx 命中,还是彻底未缓存

热门栏目