Nginx 配合 CDN 高效回源的核心是精准响应 CDN 回源请求:需正确识别真实客户端 IP、定制缓存头与响应头、优化回源链路性能、加强安全协同防止暴露与击穿。

要让 Nginx 配合 CDN 实现高效回源,核心不是“让 CDN 多缓存”,而是“让 Nginx 精准响应 CDN 的回源请求”——包括识别真实客户端、传递正确头信息、控制缓存策略、避免重复压缩或重定向。
正确识别 CDN 回源 IP 并还原真实用户信息
CDN 回源时通常用固定 IP 段(如 Cloudflare 的 173.245.48.0/20、103.21.244.0/22 等),Nginx 默认会把它们当作客户端 IP,导致日志和限流失真。
- 在 http 块中配置可信代理段:
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
real_ip_header CF-Connecting-IP; # Cloudflare 示例
# 若用阿里云 CDN,改用 X-Forwarded-For,并配合 real_ip_recursive on; - 确保 $remote_addr 在日志和 limit_req 中反映真实用户 IP,而非 CDN 节点 IP;
- 不建议仅依赖 X-Forwarded-For —— 它易被伪造,必须配合 set_real_ip_from 限定可信来源。
为 CDN 回源定制响应头与缓存指令
CDN 不是浏览器,它依据响应头决定是否缓存、缓存多久、是否透传。Nginx 需主动适配,而非沿用面向终端的规则。
- 区分回源请求与直连请求:用 map 判断是否来自 CDN:
map $http_user_agent $is_cdn_origin {
~*cloudflare 1;
~*aliyun 1;
default 0;
} - 对 CDN 回源响应添加明确缓存控制:
location / {
if ($is_cdn_origin) {
add_header Cache-Control "public, max-age=3600, stale-while-revalidate=86400";
# 不加 Vary: User-Agent 或 Cookie(除非业务强依赖)
}
} - 禁用对 CDN 无意义的头:如 X-XSS-Protection、X-Frame-Options(由 CDN 边缘或源站上层统一处理更合理)。
优化回源链路:跳过冗余处理,减少延迟
CDN 回源是高频、低容忍延迟的请求,Nginx 应避免在回源路径上执行非必要逻辑。
- 关闭回源请求的日志记录(可选):
access_log /dev/null if=$is_cdn_origin;(减轻 I/O,尤其高并发回源时) - 绕过无关模块:如不需 WAF 规则、不需 GeoIP 查询、不需 rewrite 重写(除非 CDN 要求特定 path 格式);
- 启用 sendfile on 和 tcp_nopush on,提升静态资源回源吞吐;
- 对 API 接口回源,可单独配置 proxy_cache_bypass $http_cache_control,允许 CDN 主动刷新时跳过 Nginx 缓存。
安全协同:防止回源暴露与误击穿
CDN 是屏障,但若配置不当,可能让攻击者绕过 CDN 直连源站,或让 CDN 缓存错误响应。
- 限制仅 CDN IP 可访问回源端口(如 8080):
listen 8080 ssl;
allow 173.245.48.0/20;
allow 103.21.244.0/22;
deny all; - 禁止通过 Host 头直接访问源站域名:
if ($host !~ ^(cdn\.example\.com|example\.com)$) { return 444; } - 对敏感接口(如 /admin、/api/v1/internal)返回 Cache-Control: private, no-store,并确保 CDN 配置了对应路径不缓存规则。

















