关键在于精准控制Host、X-Forwarded-For等核心请求头:透传原始Host确保后端路由正确;用X-Real-IP和X-Forwarded-For传递真实客户端IP并校验可信段;关闭Nginx缓存避免双层缓存冲突;限制回源IP并添加调试头辅助排查。

要让 CDN 和 Nginx 源站无缝对接,关键不是“加一堆头”,而是精准控制几个核心请求头,确保 CDN 回源时的行为可预期、后端识别准确、缓存策略不冲突。
必须透传 Host 头
CDN 节点回源时,会用自己的域名(如 origin.yourcdn.com)发起请求,但你的后端(比如 OSS、多租户 Web 服务或本地文件系统)可能依赖 Host 判断环境、租户或路由规则。如果 Nginx 默认把 Host 改成后端地址(如 oss.example.com),后端就收不到原始意图。
正确做法是显式保留原始 Host:
- proxy_set_header Host $host; —— 把 CDN 回源带的 Host 原样转发
- 避免写
proxy_set_header Host $proxy_host;或留空,那会导致 Host 被覆盖 - 若后端强制要求特定 Host(如 api.example.com),才改用
proxy_set_header Host api.example.com;
传递真实客户端信息
CDN 回源时,$remote_addr 是 CDN 节点 IP,不是用户真实 IP。如果你的日志、限流或风控依赖真实来源,就得靠 X-Forwarded-* 系列头还原。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
标准配置如下:
- proxy_set_header X-Real-IP $remote_addr; —— 记录 CDN 节点 IP(可用于白名单或安全审计)
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; —— 追加 CDN 节点 IP 到已有的 XFF 链中,后端可取第一个非 CDN 的 IP
- 注意:不要盲目信任 X-Forwarded-For,应在 upstream 前用
set_real_ip_from+real_ip_header X-Forwarded-For;做可信段校验
控制缓存行为,避免双层缓存干扰
Nginx 自身缓存和 CDN 缓存叠加,容易导致资源更新延迟、版本错乱。源站角色下,Nginx 应专注“准确回源”,缓存交给 CDN 统一管理。
- proxy_cache off; —— 明确关闭 Nginx 缓存模块
- 确保没有
proxy_cache_path或proxy_cache指令生效 - 响应头中可主动声明缓存策略,例如:
add_header Cache-Control "public, max-age=31536000";,让 CDN 按需缓存
补充:限制回源来源与调试辅助
防止非 CDN 流量直连源站,也便于排查问题:
- 用
allow/deny限定 CDN 节点 IP 段(需提前从 CDN 厂商获取) - 加一个调试头:
add_header X-Origin-Hit "true";,确认请求确实经过了你的 Nginx 源站 - 记录上游状态:
add_header X-Cache-Status $upstream_cache_status;,虽源站关缓存,但能验证是否真没命中

















