nginx中server_name用于匹配cdn边缘节点回源请求的host头,需配合proxy_pass和proxy_set_header host控制源站识别;支持通配符、正则及空主机名匹配,并须协同cdn厂商确认回源host策略与header透传规则。

在 Nginx 中配置 server_name 实现 CDN 边缘节点回源,核心是让边缘节点能正确识别请求目标,并将未命中缓存的请求(即需要回源的请求)按预期转发给源站。关键不在于 server_name 本身做回源,而在于它配合 proxy_pass、Host 头控制等机制,确保回源请求的 Host 和路径符合源站要求。
明确 server_name 的作用:匹配请求 Host 头
server_name 指令用于匹配客户端(或上游 CDN 边缘节点)发来的 HTTP 请求头中的 Host 字段。CDN 边缘节点向你的 Nginx 发起回源请求时,通常会设置自己的 Host(如 origin.example.com)或保持原始用户 Host。你需要让 Nginx 的 server_name 覆盖这个值,才能进入对应 server 块处理。
- 若 CDN 回源请求 Host 是
cdn-origin.myapp.com,则配置server_name cdn-origin.myapp.com; - 支持通配符:
server_name *.myapp.com;或正则:server_name ~^cdn-.*\.myapp\.com$; - 也可用空主机名匹配无 Host 头的请求(较少见):
server_name "";
回源时保留/重写 Host 头:避免源站拒绝
即使 server_name 匹配成功,Nginx 默认用 proxy_pass 后的地址作为 Host 发送给源站。多数源站依赖 Host 头判断租户或路由,所以需显式控制:
- 用
proxy_set_header Host $host;将边缘节点传来的 Host 头原样转发(推荐用于多租户或泛域名源站) - 用
proxy_set_header Host origin.myapp.com;强制指定 Host(适用于单一固定源站) - 若源站校验 SNI 或证书域名,还需确保
proxy_ssl_server_name on;开启(HTTPS 回源必需)
典型回源 server 配置示例
以下是一个面向 CDN 边缘节点的 Nginx server 块,兼顾 Host 匹配与安全回源:
server {
listen 80;
server_name cdn-origin.myapp.com;
<pre class="brush:php;toolbar:false;"># 可选:限制仅允许 CDN IP 访问(提升安全性)
allow 203.0.113.0/24; # 替换为 CDN 提供的回源段
deny all;
location / {
proxy_pass https://origin-backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# HTTPS 回源必须
proxy_ssl_verify off; # 若源站证书非权威 CA,可临时关闭验证
proxy_ssl_server_name on; # 启用 SNI,确保 TLS 握手正确
}}
其中 origin-backend 是 upstream 定义的真实源站地址(支持域名或 IP + 端口)。
注意与 CDN 厂商协同的关键点
不同 CDN(如 Cloudflare、阿里云 DCDN、腾讯云 CDN)对回源 Host、路径、Header 的处理策略不同:
- 确认 CDN 回源时是否携带原始 Host;有些 CDN 默认改写为源站域名,此时你的
server_name应匹配该值 - 检查是否需开启「回源跟随 302」或「回源带 Cookie」——这些影响 Nginx 是否要透传特定 Header
- 部分 CDN 支持自定义回源 Host 头,优先在 CDN 控制台设置,比 Nginx 层面更可控











