CDN 原理与运维
掌握 CDN 的工作原理、缓存策略、常见问题排查和主流产品对比
CDN 原理与运维
CDN 工作原理
用户请求 static.example.com
│
▼
DNS 解析(CNAME 指向 CDN 域名)
│
▼
CDN 智能调度(返回最近边缘节点 IP)
│
┌───▼───────────────────────────┐
│ 边缘节点 (Edge, L1 Cache) │
│ ┌─ 命中 → 直接返回 │
│ └─ 未命中 → 回源 │
└───────────┬───────────────────┘
│ 回源
┌───────────▼───────────────────┐
│ 源站 (Origin Server) │
│ 或 中间层 (L2 Cache) │
└───────────────────────────────┘
核心概念
| 概念 | 说明 | 示例 |
|---|---|---|
| CNAME | 将域名指向 CDN 提供的加速域名 | static.example.com → example.cdn.com |
| 边缘节点 | 离用户最近的缓存服务器 | 全国 2000+ 节点 |
| 回源 | 边缘节点 miss 时向源站请求 | 每个文件首次访问或缓存过期后 |
| 缓存命中率 | 边缘节点命中 / 总请求 | > 90% 为优秀 |
| 预热 | 主动将文件推送到各边缘节点 | 大促前提前预热静态资源 |
| 刷新 | 手动清除 CDN 上的缓存 | 文件更新后立即生效 |
缓存策略
基于 HTTP 头的缓存控制
来源优先级(数字越小越优先):
1. CDN 控制台配置的缓存规则(最高优先级)
2. Cache-Control: max-age=3600
3. Expires: Thu, 01 Dec 2025 16:00:00 GMT
4. Last-Modified(CDN 根据文件修改时间估算)
缓存 Key
默认:URL 作为缓存 Key
https://static.example.com/js/app.js?v=1.0
└─ 如果 ?v=1.0 纳入 Key,版本更新后自动换 Key
常见配置:
- 忽略 URL 参数 → 对静态文件(?v=xxx 参数仅用于版本控制)
- 不忽略 → 对需要参数区分的动态内容
常见缓存规则
| 文件类型 | 缓存时间 | 原因 |
|---|---|---|
.html | 不缓存或短缓存(60s) | 频繁更新 |
.js/.css(带 hash) | 365 天 | 文件内容变化时文件名也变 |
.png/.jpg/.svg | 30 天 | 不常变 |
| API 响应 | 视业务(通常不缓存) | 动态数据 |
CDN 产品对比
| 产品 | 厂商 | 节点数 | 特色 |
|---|---|---|---|
| 阿里云 CDN | 阿里云 | 2800+ | 国内覆盖最好,与 OSS 无缝集成 |
| 腾讯云 CDN | 腾讯云 | 2000+ | 价格低,直播加速强 |
| CloudFront | AWS | 400+ | 全球覆盖好,与 S3 集成 |
| Cloudflare | Cloudflare | 全球 | 免费套餐,DDoS 防护,全球加速 |
| 又拍云 | 又拍云 | 国内 1000+ | 按流量计费简单 |
运维实操
接入检查清单
1. □ DNS CNAME 配置正确(dig 验证)
2. □ HTTPS 证书已部署到 CDN(或 CDN 代理 HTTPS)
3. □ 源站允许 CDN 回源 IP 段
4. □ 缓存规则已配置(按文件类型/目录)
5. □ 预热核心静态资源(批量推送到边缘节点)
6. □ 监控命中率和回源带宽
缓存刷新
# 阿里云 CDN 刷新
aliyun cdn RefreshObjectCaches \
--ObjectPath https://static.example.com/js/app.js \
--ObjectType File
# 目录刷新(谨慎使用——消耗配额大)
aliyun cdn RefreshObjectCaches \
--ObjectPath https://static.example.com/js/ \
--ObjectType Directory
# 刷新策略选择:
# 文件更新 → File 刷新(精确、快)
# 批量更新同目录 → Directory 刷新(消耗大)
# 大版本发布 → 全站刷新 + 预热(慎用)
预热
# 提前将大文件推送到边缘节点
aliyun cdn PushObjectCache \
--ObjectPath https://static.example.com/app-1.0.0.js
常见故障
| 问题 | 可能原因 | 排查 |
|---|---|---|
| 部分地区不可用 | CDN 节点故障 | curl -H "Host:static.example.com" http://CDN节点IP/... |
| 源站内容更新不生效 | CDN 缓存未过期 | 手动刷新或等 TTL 过期 |
| 命中率低 | 缓存规则不合理 | 检查哪些 URL 回源最多 |
| HTTPS 证书错误 | CDN 证书过期 | 检查 CDN 控制台证书管理 |
| 回源失败 | 源站防火墙屏蔽 CDN IP | 添加 CDN 回源 IP 白名单 |
面试问答
Q1: CDN 的工作原理是什么?
“用户访问域名时,DNS 解析到 CDN 的 CNAME,CDN 智能调度系统返回离用户最近的边缘节点 IP。边缘节点如果有缓存直接返回(命中),没有则回源站拉取(回源)后缓存再返回。核心是就近访问 + 缓存策略。”
Q2: 静态资源更新后用户看到的还是旧版本,怎么处理?
“几种方案:一是 CDN 缓存刷新——手动清掉 CDN 上的旧缓存,立即可用;二是文件名加版本 hash——app.v1.js → app.v2.js,从根源上避免缓存冲突(推荐);三是缩短缓存时间——但对命中率有影响。”
Q3: CDN 命中率很低怎么排查?
“先看 CDN 控制台的 URL 回源排行,找到回源最多的几个 URL。常见原因:Cache-Control 头设了 no-cache、URL 带了随机参数导致每个请求的缓存 Key 都不同、缓存时间太短。针对性调整缓存规则。”
Q4: CDN 和 OSS/S3 直传有什么区别?场景怎么选?
“OSS 是存储,CDN 是加速。对静态资源的标准做法是 OSS 做源站 + CDN 加速——OSS 存文件,CDN 提供全球加速。如果用户集中在某个区域且 OSS 同地区,可以不用 CDN;如果用户分散全国/全球,CDN 是必选项。另外 CDN 提供 HTTPS 证书管理、DDoS 防护等附加价值。”
Q5: CDN 怎么处理动态内容和静态内容?
“静态内容(图片、JS、CSS)加长缓存时间 + 文件名 hash 做版本控制。动态内容(API 响应)通常不缓存或只做短暂的 CDN 加速(不缓存内容,只做网络传输加速——利用 CDN 节点到源站的专线)。判断标准:内容是否因人而异、是否频繁更新。”