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/.svg30 天不常变
API 响应视业务(通常不缓存)动态数据

CDN 产品对比

产品厂商节点数特色
阿里云 CDN阿里云2800+国内覆盖最好,与 OSS 无缝集成
腾讯云 CDN腾讯云2000+价格低,直播加速强
CloudFrontAWS400+全球覆盖好,与 S3 集成
CloudflareCloudflare全球免费套餐,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.jsapp.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 节点到源站的专线)。判断标准:内容是否因人而异、是否频繁更新。”