Nginx缓存层与CDN集成需职责分层、能力互补:CDN负责广覆盖静态资源分发,Nginx聚焦动态内容、差异化响应与精细缓存控制,关键在避免重复缓存、明确回源边界及协同生命周期。

Nginx 缓存层与 CDN 的集成不是简单叠加,而是职责分层、能力互补:CDN 负责广覆盖、低延迟的静态资源分发;Nginx 则聚焦于动态内容、用户差异化响应和精细缓存控制。关键在于避免重复缓存、明确回源边界、协同缓存生命周期。
明确分工:CDN 做广度,Nginx 做精度
CDN 适合缓存高命中率、无状态的静态资源(如 .js/.css/.png),节点离用户近,但策略粗粒度、回源逻辑固定;Nginx 部署在业务入口或区域网关,更适合缓存带上下文的动态内容——比如登录态首页、按语言/设备返回的 API 响应、含查询参数的接口结果。
- 建议 CDN 关闭对 /api/、/user/、/admin/ 等路径的缓存,或设 TTL=1s,交由 Nginx 决策
- Nginx 的 proxy_cache_key 应包含 $scheme$host$request_uri$http_cookie$http_accept_language,确保登录态、多语言版本各自独立缓存
- 为防止 CDN 和 Nginx 同时缓存同一请求,可在 CDN 回源时添加自定义头(如 X-From-CDN: true),Nginx 中用 set $skip_cache "1" 跳过本地缓存逻辑
缓存配置:两级管理 + 主动降级
Nginx 缓存需兼顾性能、可靠与容错,不能只依赖 expires 或源站 Cache-Control。必须手动定义缓存区、有效期、锁机制和错误兜底。
-
proxy_cache_path 示例:
/var/cache/nginx/api_cache levels=1:2 keys_zone=api_cache:100m max_size=5g inactive=60m use_temp_path=off;
其中 inactive=60m 比 TTL 更可靠——即使源站未返回过期头,60 分钟未被访问的缓存也会自动清理 -
proxy_cache_valid 设基础有效期,例如:
proxy_cache_valid 200 302 10s; - 搭配 proxy_cache_use_stale 实现服务韧性:
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
源站异常时,仍可返回旧缓存,保障可用性 - 启用 proxy_cache_lock on; 防止缓存失效瞬间大量请求穿透(缓存击穿),并设置 proxy_cache_lock_timeout 3s 避免长尾请求阻塞
回源协同:头信息传递与缓存一致性
CDN 回源到 Nginx 时,需确保关键上下文不丢失,并让 Nginx 能识别“这是 CDN 来的请求”,从而执行差异化逻辑。
- 在 proxy_pass 前添加:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
保证日志、鉴权、路由逻辑准确 - 用 add_header X-Cache-Status $upstream_cache_status; 向 CDN 返回缓存状态(HIT/MISS/EXPIRED),便于排查命中率问题
- 若源站返回了 Cache-Control: no-cache 或 private,Nginx 默认会跳过缓存;此时可用 proxy_ignore_headers Cache-Control Expires Set-Cookie; 强制接管缓存策略
动静分离与路径隔离
物理路径与逻辑路径的清晰隔离,是避免缓存混淆的前提。静态资源走 CDN 直接分发,动态接口统一经 Nginx 缓存层处理。
- 静态资源建议单独域名(如 static.example.com)或路径前缀(如 /static/),并在 Nginx 中关闭代理缓存,仅设 expires 和 Cache-Control
- 动态接口统一走 /api/ 或 /v1/ 等路径,由 Nginx 的 proxy_cache 处理,且 key 中必须包含影响响应的变量(如 cookie、accept-language)
- 对需要绕过缓存的调试请求,可用 proxy_cache_bypass $arg_nocache;,当 URL 带 ?nocache=1 时跳过缓存


















