为什么网站开了 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