CDN管广度、Nginx管精度,分层定责不互信:CDN缓存带哈希的静态资源并设max-age=31536000,/api等路径bypass;Nginx按用户上下文缓存动态内容,回源时通过X-From-CDN头跳过本地缓存,并注入标准Cache-Control头。

核心是分层定责、头信息可控、生命周期对齐——CDN 管广度,Nginx 管精度,两者不互信、不叠加、不覆盖。
明确缓存分工,避免策略重叠
CDN 只应缓存无状态、高命中率的静态资源(如 .js/.css/.png),路径上严格限制:
- 对 /api/、/user/、/admin/、含 Cookie 或 Authorization 的请求,在 CDN 层设 TTL=1s 或直接 bypass
- Nginx 不对这些路径启用
proxy_cache,改用动态响应或按需代理 - 静态资源路径统一带内容哈希(如
/static/app.a1b2c3.js),让 CDN 和浏览器都视其为不可变资源
控制回源头信息,防止信号污染
CDN 回源到 Nginx 时,必须传递上下文,同时屏蔽干扰头:
- 在 CDN 回源请求中添加标识头:
X-From-CDN: true - Nginx 中用
map或if判断该头,跳过本地缓存:set $skip_cache "1"; - 用
proxy_hide_header Cache-Control;清除后端返回的缓存头,再由 Nginx 主动注入标准指令:add_header Cache-Control "public, max-age=31536000"; - 透传关键头:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;、proxy_set_header Host $host;
差异化缓存键与生命周期管理
同一 URL 在不同场景下应视为不同资源,靠缓存键和有效期精细控制:
- Nginx 的
proxy_cache_key必须包含用户上下文:$scheme$host$request_uri$http_cookie$http_accept_language - CDN 缓存键只需基础字段:
$host$request_uri(不含 Cookie、语言等) - Nginx 的
proxy_cache_valid按状态码分级设置,例如:proxy_cache_valid 200 302 5m;;CDN 对静态资源统一设为max-age=31536000 - 用
inactive=60m替代仅依赖后端Cache-Control,确保冷数据自动清理
验证与兜底机制不可少
上线前必须确认缓存行为是否符合预期:
- 检查响应头:
curl -I https://example.com/static/main.js,确认返回Cache-Control: public, immutable,且无no-cache干扰 - 查看 Nginx 日志字段:
$upstream_cache_status,正常应为HIT或MISS,而非BYPASS或EXPIRED - 启用容错:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;,源站异常时仍可返回旧缓存 - 加锁防击穿:
proxy_cache_lock on;+proxy_cache_lock_timeout 3s;


















