nginx 作为 cdn 源站需配置路径映射、放行 cdn ip、禁用直接访问;设置 immutable 缓存头;适配回源请求头;可选启用 proxy_cache 双缓存。

要在 Nginx 中为静态资源实现 CDN 回源加速,核心是让 Nginx 作为「源站」被 CDN 正确回源,同时自身做好缓存控制、路径映射与请求头适配。这不是在 Nginx 里“调用 CDN”,而是把它配置成 CDN 愿意信任、能高效回源、且返回内容利于边缘缓存的后端服务。
一、确保静态资源可被 CDN 稳定回源
CDN 必须能稳定访问你的 Nginx 源站,且路径结构清晰:
- 为静态资源单独配置 location 块(推荐用 alias 而非 root),避免路径拼接错误。例如:
location /static/ { alias /var/www/assets/; } - 开放 CDN 节点 IP 段的访问权限(如阿里云 CDN 回源段、Cloudflare ASN 列表),必要时在 firewall 或 Nginx 的 allow/deny 中放行
- 禁用或限制对源站域名的直接公网访问(如通过 server_name 匹配 + return 444),防止绕过 CDN
二、设置强缓存响应头(关键)
CDN 是否缓存、缓多久,高度依赖 Nginx 返回的 HTTP 缓存头。必须明确告知资源不可变性:
- 对 JS/CSS/字体/图片等构建产物,统一设为 1 年有效期 + immutable:
add_header Cache-Control "public, immutable, max-age=31536000";
expires 1y; - 避免使用仅含 max-age 的弱声明,immutable 是告诉 CDN 和浏览器“URL 改了才换新文件”,极大提升复用率
- 禁用 Vary: Cookie 或 User-Agent(除非业务强依赖),否则 CDN 可能因 header 差异不缓存
三、适配 CDN 回源请求头
CDN 回源时会携带特定 header(如 X-Forwarded-For、X-Cdn-Request),Nginx 需正确识别真实客户端与协议:
- 启用 real_ip 模块,信任 CDN 回源 IP 段:
set_real_ip_from 100.64.0.0/10; # 阿里云 CDN 示例
real_ip_header X-Forwarded-For; - 强制传递 Host 头,确保后端服务(如应用层)路由正确:
proxy_set_header Host $host; - 若启用了 HTTPS 回源,Nginx 需监听 443 并配置有效证书,或回源走 HTTP(需 CDN 控制台开启“HTTP 回源”)
四、可选:Nginx 层增加 proxy_cache(双缓存)
在源站 Nginx 上加一层本地磁盘缓存,可进一步降低回源压力,尤其适合高并发但更新不频繁的静态资源:
- 定义缓存区:
proxy_cache_path /data/nginx/proxy_cache levels=1:2 keys_zone=static_cache:100m inactive=7d max_size=20g; - 在静态 location 中启用:
proxy_cache static_cache;
proxy_cache_key "$scheme$host$request_uri";
proxy_cache_valid 200 302 7d; - 注意:需搭配 proxy_pass 使用(即该 location 实际反向代理到另一个 upstream),而非直接 serve 文件











