为什么网站开了 CDN 反而更慢

CDN 的原理很简单:把内容放到离用户更近的地方。但很多人反馈"开了 CDN 之后网站反而变慢了"——问题几乎都出在缓存策略没配好:不该缓存的 HTML 被缓存了、静态资源 TTL 太短导致每次都要回源、或者动态接口被错误缓存造成数据过期。先想清楚"什么该缓存、缓存多久",再谈服务商,顺序不能反。

AI 提示词模板

请帮我配置 CDN 加速方案。
- 网站类型:[企业站/电商/博客/视频站]
- 目标用户:[中国大陆/全球/亚太]
- 加速内容:[静态文件/全站动态/图片视频]

推荐:CDN 服务商、缓存策略、SSL 配置、回源配置、成本估算。

按内容类型制定缓存策略

不是所有内容都用同一种缓存方式:

内容类型 示例 策略 CDN TTL
静态资源 JS、CSS、图片、字体 强缓存 + CDN 30 天
HTML 页面 文章、产品页 CDN 缓存 + 回源校验 1 小时
动态内容 搜索、用户中心 不缓存
API 响应 结构化数据 按接口单独配置 视情况而定

一个实用的原则:能在 CDN 层缓存的内容尽量缓存。每消灭一次回源,用户加载更快、源站压力更小。缓存细节可参考 CDN 缓存策略,命中率优化见 缓存命中率优化。

Cloudflare 配置要点

配置项 推荐设置
SSL/TLS Full (strict)
缓存 静态资源 30 天
Brotli 开启
WAF 开启

SSL 用 Full (strict) 时,源站证书需要是有效签发而非自签,否则会报 526 错误。中国大陆访问建议单独评估:Cloudflare 免费版的国内节点回源质量差异较大,可以对比 阿里云 CDN、腾讯云 CDN 的国内节点再做选择。

Nginx 缓存配置示例

如果源站是 Nginx,可以用以下片段给静态资源设置长缓存:

location ~* \.(jpg|png|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

immutable 告诉浏览器"这个文件不会变",可以放心用缓存,配合文件名带哈希的构建产物尤其有效。

回源优化

连接复用

源站开启 Keep-Alive,避免每次回源都重新建立 TCP 连接。Nginx 默认 keepalive_requests 100,反向代理场景建议调大。

分块回源

超过 10MB 的大文件,开启分段回源让 CDN 节点并行拉取分片,能显著缩短首次回源时间。

缓存预热

大促或内容上线前,用预热工具主动把内容推到 CDN 节点,等用户访问时内容已经在节点上。配合 缓存刷新与预热 一起用。

CDN 命中率分析(Python)

from collections import Counter
counter = Counter()
with open('cdn.log') as f:
    for line in f:
        if ' HIT ' in line: counter['HIT'] += 1
        elif ' MISS ' in line: counter['MISS'] += 1
total = counter['HIT'] + counter['MISS']
ratio = (counter['HIT'] / total * 100) if total else 0
print(f"Hit ratio: {ratio:.1f}%")

把这条脚本接到 CDN 日志上定时跑,命中率低于 70% 就说明缓存策略需要调整。

多 CDN 策略

单一 CDN 服务商可能存在覆盖盲区,多 CDN 可以按区域分配:

  • 中国大陆:阿里云 CDN 或 腾讯 EdgeOne
  • 亚太:CloudFront 或 Cloudflare
  • 欧美:Fastly 或 Cloudflare

多 CDN 会引入 DNS 层的复杂度,但对性能敏感的全球化应用值得。GSLB 与故障切换的具体做法见 多 CDN 负载均衡。

上线后持续监控

开启 CDN 后,每两周回看这些指标:

  • 命中率:低于 70% 说明缓存策略有问题;
  • 回源带宽:突然上涨通常意味着 TTL 太短;
  • 分区域延迟:各区域延迟差异不应超过 500ms。

上线前检查清单

正式切流量之前,对照这份清单过一遍,能避免多数上线事故:

  • 缓存策略已按内容类型区分,HTML 不做 30 天长缓存;
  • 源站已开启 Keep-Alive,SSL 证书有效且匹配(Full strict 下不能自签);
  • 动态接口已排除缓存或设置较短 TTL;
  • 已做域名 CNAME 解析并验证证书下发;
  • 已配置好告警,命中率与回源带宽可观测。

一个落地案例

一个面向东南亚的电商站原来直连源站(新加坡),印尼用户平均打开 4.2 秒。接入 CloudFront + 本地边缘节点后,静态资源命中率做到 91%,印尼用户首屏降到 1.1 秒。但首月回源带宽也涨了 30%——排查发现是 HTML 页面 TTL 设了 30 天,改回 1 小时并加 Cache-Control: no-cache 校验后,回源带宽回落,页面更新也即时生效。这个案例的教训是:缓存策略要在"速度"和"新鲜度"之间找平衡。

常见问题

CDN 一定能加速吗? 不一定。如果源站响应本身很慢(比如动态接口耗时 3 秒),CDN 只能缓存静态部分;核心还是要先优化源站。

静态资源 TTL 设 30 天会不会影响更新? 会,所以要用"文件名带哈希 + 内容更新时改文件名"的发布方式,而不是直接覆盖同名文件。

开启 CDN 后 HTTPS 证书怎么处理? 让 CDN 负责用户侧的 TLS 终止,回源走内部网络;证书统一在 CDN 控制台配置,源站证书可用免费证书。

参考:Cloudflare 缓存文档 — https://developers.cloudflare.com/cache/ ;Nginx HttpCacheModule — https://nginx.org/en/docs/http/ngx_http_proxy_module.html