Apache ServerName 配合 CDN 加速如何写

作者:袖梨 2026-09-03

Apache 的 ServerName 必须与 CDN 加速域名严格一致,否则导致路由错误、缓存失效或 HTTPS 混合内容问题;它标识源站响应的域名(如 cdn.example.com),需配合 ServerAlias、Cache-Control 响应头及 CDN 回源配置共同生效。

Apache 的 ServerName 本身不直接参与 CDN 加速,但它必须与 CDN 的域名配置严格一致,否则会导致请求无法正确路由、缓存失效或 HTTPS 混合内容错误。关键不是“怎么写”,而是“怎么配得准”。

ServerName 必须匹配 CDN 加速域名

CDN 加速时,用户访问的是你配置的加速域名(如 cdn.example.comstatic.example.com),而不是源站主域名(example.com)。Apache 必须明确识别这个入站域名:

  1. 在虚拟主机配置中,ServerName 应设为你的加速域名,例如:

    ServerName cdn.example.com

  2. 如有 www 变体,用 ServerAlias 补充:

    ServerAlias www.cdn.example.com

  3. 不要把源站主域名(example.com)写在这里——它应由另一个独立的虚拟主机处理,避免混用

配合 CDN 的实际配置示例

假设你用 Vultr CDN 或自建 Nginx 边缘节点,后端 Apache 只负责源站响应,那么 Apache 配置片段应类似:

<VirtualHost *:80>ServerName cdn.example.comServerAlias static.example.comDocumentRoot /var/www/static
# 确保响应头带 Cache-Control,便于 CDN 缓存&lt;IfModule mod_headers.c&gt;Header set Cache-Control "public, max-age=31536000, immutable"&lt;/IfModule&gt;# 禁止对静态资源返回 Set-Cookie(避免缓存污染)&lt;FilesMatch ".(jpg|jpeg|png|gif|css|js|woff2|svg)$"&gt;Header unset Set-Cookie&lt;/FilesMatch&gt;

</VirtualHost>

注意:ServerName 这里只是告诉 Apache “谁在调我”,真正决定流量是否走 CDN 的是 DNS 的 CNAME 设置(比如把 cdn.example.com 指向 xxx.vultrcdn.com)。

HTTPS 场景下必须同步证书和 ServerName

如果 CDN 启用了 HTTPS 回源(推荐),且你让 CDN 通过 HTTPS 访问 Apache 源站,那么:

  1. Apache 的 SSL 虚拟主机中,ServerName 仍为 cdn.example.com
  2. 需为该域名单独部署有效 TLS 证书(可用 Certbot 自动签发)
  3. 若 Apache 只监听 HTTP(CDN 终止 HTTPS),则无需 SSL 配置,但务必确保 CDN 的回源协议设为 http://,避免 301 重定向导致缓存失败

验证是否生效的两个动作

配置完别只看语法是否正确,要确认实际行为:

  1. curl -I http://cdn.example.com/test.jpg 查看响应头是否有 Cache-Control,且无 Set-Cookie
  2. 在 Apache 日志中检查访问来源 IP —— 正常应看到 CDN 节点的 IP(如 Vultr 的 IP 段),而非真实用户 IP;如看到大量用户直连,说明 DNS CNAME 未生效或 ServerName 不匹配导致请求被 fallback 到默认虚拟主机

相关文章

精彩推荐