CDN 解决的核心问题
没有CDN时,全国用户都访问同一台源站服务器,北京用户到上海源站的RTT约30ms,而新疆用户可能超过100ms。CDN通过在全国(乃至全球)部署边缘节点,让用户就近获取内容,将延迟降低到5~20ms。
CDN 请求完整流程
当用户访问 cdn.example.com/logo.png 时,发生了什么?
- DNS解析:用户的DNS查询被CDN的智能DNS拦截,根据用户IP地理位置和运营商,返回最近的边缘节点IP。
- 命中检查:边缘节点检查本地缓存中是否有该资源(Cache HIT/MISS)。
- 缓存命中(HIT):直接从边缘节点返回缓存内容,无需回源。延迟极低(5~20ms)。
- 缓存未命中(MISS):边缘节点向上一级节点或源站发起回源请求,获取内容后缓存并返回给用户。
- 缓存存储:边缘节点按照缓存策略存储内容,等待后续请求命中。
缓存控制:最重要的CDN配置
CDN缓存行为由HTTP响应头控制,理解这些头是正确使用CDN的关键:
| 响应头 | 作用 | 典型配置示例 |
|---|---|---|
| Cache-Control: max-age | 资源在CDN缓存的最大时间(秒) | 静态资源:max-age=31536000(1年) |
| Cache-Control: no-cache | 每次使用前需向源站验证 | 动态内容、HTML页面 |
| Cache-Control: no-store | 禁止任何缓存(CDN和浏览器) | 敏感数据、实时数据 |
| ETag | 资源指纹,用于协商缓存验证 | 服务器自动生成 |
| Vary | 指定哪些请求头影响缓存版本 | Vary: Accept-Encoding(Gzip/Brotli分缓存) |
缓存策略最佳实践
- 静态资源(图片/字体/JS/CSS):设置超长缓存(1年),通过文件名Hash保证更新(如 main.a3b4c5.js)。
- HTML页面:通常不缓存或短缓存(5~10分钟),保证内容更新及时生效。
- API响应:根据数据实时性需求决定,可缓存1~60秒减少源站压力。
- 用户个性化内容:绝对不能缓存(含Cookie、用户ID的请求),否则会出现”串号”问题。
CDN 命中率优化
缓存命中率(Hit Rate)是衡量CDN效果的核心指标,提升命中率的方法:
- 忽略无关查询参数:url?_ga=xxx 和 url 应命中同一缓存,在CDN配置中设置忽略追踪参数。
- 规范化URL:example.com/page 和 example.com/page/ 应映射到同一缓存键。
- 延长缓存TTL:在合理范围内延长TTL,减少回源次数,提升命中率。
- 预热缓存(Cache Warming):新内容上线后主动预热,避免冷启动时大量请求穿透到源站。
主流 CDN 服务商对比
| 服务商 | 节点规模 | 优势 | 适用场景 |
|---|---|---|---|
| Cloudflare | 330+城市 | 免费套餐强大,DDoS防护一流 | 国际业务首选 |
| 阿里云CDN | 2800+节点 | 国内覆盖最广,与阿里云生态深度集成 | 国内业务首选 |
| 腾讯云CDN | 2000+节点 | 视频/游戏加速专长,国内覆盖强 | 媒体/游戏类业务 |
| 又拍云/七牛云 | 中等规模 | 图片处理功能强,价格亲民 | 图片/媒体存储分发 |
CDN 常见问题排查
- 内容更新了但用户看到的还是旧版本:执行CDN刷新(Purge)操作,或等待缓存TTL过期。
- CDN命中率很低(<70%):检查Cache-Control配置,排查是否有大量个性化参数导致缓存键分散。
- HTTPS证书问题:确认CDN域名已正确配置SSL证书,开启HTTPS时回源也建议使用HTTPS。