Nginx作为华为云或阿里云CDN源站需做好三件事:正确识别真实客户端IP、严格限制非CDN回源请求、适配CDN缓存与头信息行为;分别通过real_ip模块配置、geo+map+if拦截及Cache-Control等响应头控制实现。

要让 Nginx 作为华为云或阿里云 CDN 的源站稳定、安全、高效地工作,核心不是“越复杂越好”,而是做好三件事:正确识别真实客户端 IP、严格限制非 CDN 回源请求、适配 CDN 的缓存与头信息行为。下面直接给出生产环境验证过的标准化配置和关键说明。
一、必须开启 real_ip 模块并正确设置可信 IP 段
CDN 回源时,用户真实 IP 会放在 X-Forwarded-For 或 X-Real-IP 头里,但 Nginx 默认记录的是 CDN 节点的出口 IP。不处理会导致日志、限流、地理判断全部失效。
华为云 CDN 和阿里云 CDN 都公开了回源 IP 段(需定期更新),配置示例如下:
set_real_ip_from 100.64.0.0/10; # 华为云私有回源网段 set_real_ip_from 139.194.0.0/16; # 阿里云部分公网回源段(以官方最新为准) set_real_ip_from 112.124.0.0/14; set_real_ip_from 118.31.0.0/16; <p>real_ip_header X-Forwarded-For; real_ip_recursive on;
注意:不要写死所有可能 IP 段,应只添加你实际接入的 CDN 厂商公布的回源段;real_ip_recursive on 表示逐级解析 X-Forwarded-For 最右非信任 IP,确保取到最原始用户 IP。
二、用 geo + map + if 严格拦截非法回源
只靠防火墙或安全组不够——CDN 节点 IP 动态变化,且攻击者可能伪造 X-Forwarded-For 头直连你的源站。必须在 Nginx 层做主动拒绝。
标准做法是:定义可信 CDN 网段 → 映射为变量 → 在 server 或 location 中拒绝非可信来源:
geo $not_from_cdn {
default 1;
100.64.0.0/10 0; # 华为云
139.194.0.0/16 0; # 阿里云
112.124.0.0/14 0;
118.31.0.0/16 0;
}
<p>map $not_from_cdn $should_deny {
1 "1";
0 "";
}</p><p>server {
listen 80;
server_name example.com;</p><pre class="brush:php;toolbar:false;">if ($should_deny) {
return 403 "Direct access not allowed";
}
# 后续正常配置...}
这个组合比单纯用 allow/deny 更灵活,支持多 CDN 共存,也便于后续扩展(比如把 $should_deny 接入 WAF 规则)。
三、适配 CDN 缓存行为的关键 header 控制
CDN 不会无脑缓存你的响应。你需要通过响应头明确告诉它“哪些能缓存、缓存多久、是否区分参数”:
-
Cache-Control:优先级高于 Expires。静态资源建议设为
public, max-age=31536000, immutable(一年+不可变) - Vary:如需按 User-Agent 或 Accept-Encoding 区分缓存,必须显式声明,否则 CDN 可能合并不同版本
- ETag / Last-Modified:务必开启,CDN 强依赖这些做协商缓存(304)
- 避免 Set-Cookie:除登录态接口外,普通页面/图片/JS/CSS 返回 Set-Cookie 会导致 CDN 不缓存(华为云/阿里云均默认跳过带 Cookie 的响应)
Nginx 示例(放在 server 或 location 内):
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}
<p>location /api/ {
add_header Cache-Control "no-cache, no-store, must-revalidate";
add_header Pragma "no-cache";
add_header Expires "0";
}四、可选但强烈建议:启用 OCSP Stapling 和 HSTS
CDN 回源走 HTTPS 时,TLS 握手性能和安全性直接影响首屏速度。两个小配置提升显著:
- ssl_stapling on + ssl_stapling_verify on:让 Nginx 主动获取并缓存 OCSP 响应,避免客户端直连 CA 查询
- add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always:强制浏览器后续只走 HTTPS,防止降级攻击(注意首次访问仍需 HTTPS)
这两项不增加 CDN 配置负担,但能降低 TLS 延迟、增强全链路可信度。


















