CDN 接入与运营实战
本文是 CDN 技术系列的实战篇,聚焦于 CDN 的落地配置与日常运营——内容分类决策、供应商选型、接入配置、Purge 操作规范、监控体系与故障排查。CDN 的底层运作原理(三层架构、调度机制、缓存算法)见第一篇《CDN 技术体系:从分发原理到工程落地》;如何从业务目标出发做架构设计和全球化决策,见第二篇《内容分发体系设计:CDN 架构决策与全球化落地》。
一、需要了解:两个核心概念就够了
为什么 CDN 能提速
物理限制:光在光纤里的速度约 20 万公里/秒。北京到洛杉矶的光纤单程就有 85ms,加上握手和处理,一次 HTTPS 请求轻松超过 300ms。CDN 的做法是在全球各地部署边缘节点,把你的内容副本放到离用户最近的地方,把跨洲的 300ms 压缩到同城的 5-20ms。
对你最有用的一个心智模型:CDN 是你的源站和用户之间的一层缓存,命中缓存时用户直接从边缘节点拿内容,不命中才回源到你的服务器。
缓存命中率决定一切
缓存命中(Hit)意味着用户从边缘节点拿到内容,延迟低、不消耗你源站资源;未命中(Miss)意味着 CDN 要回源,延迟高、源站承压。命中率是 CDN 效果的核心指标。
静态资源(JS/CSS/图片)的命中率应该在 95% 以上,如果低于这个水平,说明缓存策略有问题——要么 TTL 太短,要么缓存键设计导致大量资源被分裂成不同缓存条目。
理解了这两点,后面的决策都是从这里推导出来的。
二、需要决策:哪些内容上 CDN
按内容类型做分类决策
几个关键判断原则:
JS / CSS / 图片:无脑上,配版本化 URL。 这类内容完全可以长时间缓存,唯一的问题是更新时要让用户拿到新版本。解法是把文件内容 hash 嵌入文件名(构建工具自动处理),文件变了 URL 变了,CDN 自然缓存新版本,旧 URL 对应旧版本继续有效。缓存 TTL 设为 1 年加 immutable 指令。
HTML 入口页:需要缓存,但 TTL 要短。 HTML 页面通常不频繁更新,但不能用版本化 URL(因为它是入口)。合理策略是短 TTL(5 分钟到 1 小时,根据更新频率决定)加上发布时主动 Purge。如果你的站点是 SPA,HTML 只是壳,可以激进地设短 TTL 或 no-cache(每次校验但不回源,304 居多)。
视频和大文件:长 TTL,用版本化路径管理。 点播视频、安装包、固件这类大文件,访问一次传输成本很高,要尽可能命中缓存。用版本号或 hash 作为路径的一部分(/releases/v2.1.0/app.pkg),新版本用新路径,完全不需要 Purge。
API 接口:谨慎,区分场景。 大多数 API 不适合缓存,因为响应是动态的、个性化的。例外是那些返回结果相对固定的查询接口(城市列表、汇率、商品分类),可以设极短的 TTL(10 秒到 5 分钟)配合 stale-while-revalidate,显著降低源站压力。带 Cookie 或 Authorization Header 的请求一定不要缓存。
个性化内容:直接绕过 CDN。 用户的消息列表、个人推荐、购物车——这类内容不同用户完全不同,缓存毫无意义,而且一旦缓存配置错误,后果是 A 用户看到 B 的数据。源站响应必须设置 Cache-Control: no-store 并确认 CDN 配置不会覆盖这个 Header。
动态加速:不是万能药
很多 CDN 厂商提供"动态加速"或"全站加速"——即对不可缓存的动态请求也通过 CDN 的专线网络和 TCP 优化来降低延迟。
动态加速值得投入的场景:跨地域访问(用户在海外访问国内的 API)、网络路径质量差(运营商互联瓶颈)、对 API 延迟极其敏感的业务(实时游戏、支付)。
不值得的场景:用户和源站在同一地区、API 延迟不是瓶颈、预算有限。动态加速的费用通常远高于静态 CDN,国内厂商的定价普遍在静态流量的 5-10 倍。
三、需要决策:供应商选型
国内外主流供应商横评
国内:阿里云 vs 腾讯云 vs 其他
阿里云 CDN 是国内综合能力最全的选择:节点覆盖广、产品线完整(静态 CDN / DCDN 动态加速 / 视频点播 VOD / 直播 CDN)、控制台功能成熟、与 OSS 深度集成(可以直接把 Bucket 作为 CDN 源站)。如果你的基础设施在阿里云上,优先选它。
腾讯云 CDN 在游戏和社交场景有积累,和微信生态集成紧密。价格略低于阿里云,在部分地区的节点质量(尤其教育网)评价不一。如果业务在腾讯云或有微信小程序,选腾讯云减少跨云流量费。
网宿 / 白山 / 又拍云 是国内老牌 CDN 服务商。适合需要大量定制化配置、有专属带宽需求的大客户。中小产品用云厂商 CDN 更省心,有专业运维支持。
国内 CDN 的铁律:必须有 ICP 备案。 在中国大陆落地节点的 CDN 服务,域名必须完成 ICP 备案。没有备案直接接入会被工信部要求关停。如果是新产品还在内测,可以先用海外节点临时提速,备案完成后再切国内节点。
海外:Cloudflare vs CloudFront vs 其他
Cloudflare 是全球最推荐的默认选项,原因有几个:免费层功能完整(基础 CDN + DDoS 防护 + SSL + 基础 WAF 全免费)、Anycast 架构延迟极低、配置界面友好、API 完善可自动化。对于出海产品、个人项目、中小团队,Cloudflare 是最高性价比的起点。劣势是在中国大陆没有落地节点(只有香港),大陆访问速度差。
AWS CloudFront 是 AWS 体系用户的自然选择,与 S3、EC2、Lambda@Edge 深度集成,在边缘运行自定义逻辑非常方便。定价比 Cloudflare 贵,适合已经重度使用 AWS 的团队。
Fastly 在开发者工具和边缘计算方向能力强,支持 VCL 自定义缓存逻辑,适合需要复杂缓存规则的场景。客单价高,适合中大型团队。
Azure CDN / Google Cloud CDN 同理,分别适合 Azure 和 GCP 体系的用户,避免跨云流量费。
按业务类型的推荐路径
| 业务类型 | 国内 | 海外 | 备注 |
|---|---|---|---|
| 纯国内产品 | 阿里云 / 腾讯云 CDN | — | 按云基础设施选,ICP 必须 |
| 纯出海产品 | — | Cloudflare 起步 | 免费层够用,按量升级 |
| 全球化产品 | 阿里云 / 腾讯云 | Cloudflare 或 CloudFront | 双 CDN,GeoDNS 分流 |
| 视频点播 | 阿里云 VOD / 腾讯云 VOD | AWS CloudFront + S3 | 专属视频 CDN,含转码 |
| 游戏 | 腾讯云 CDN | Cloudflare | 游戏客户端更新包场景 |
| To B SaaS | 阿里云或腾讯云 | CloudFront | 大客户可能要求数据本地化 |
四、需要决策:缓存策略设计
Cache-Control Header 是核心
CDN 的缓存行为由源站响应的 Cache-Control Header 控制。这是你最重要的配置点,写错了覆盖整个 CDN 都没用。
| 指令 | 含义 | 典型使用场景 |
|---|---|---|
max-age=31536000 |
缓存 1 年 | 版本化静态资源 |
immutable |
配合 max-age,告诉浏览器文件不会变 | 版本化静态资源 |
no-cache |
每次必须向服务器验证(不等于不缓存) | HTML 入口页 |
no-store |
完全禁止缓存 | 个性化内容、敏感数据 |
s-maxage=300 |
专门控制 CDN 缓存时间(覆盖 max-age) | CDN 缓存 5 分钟,浏览器端更短 |
stale-while-revalidate=60 |
缓存过期后仍可提供旧内容 60 秒,后台刷新 | API 接口短时间容忍旧数据 |
实际配置参考:
# 版本化静态资源(app.a3b2c1.js)
location ~* \.(js|css|woff2)$ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
# HTML 入口(/index.html)
location = /index.html {
add_header Cache-Control "public, no-cache";
}
# 图片(可能被更新,不用版本化 URL 的场景)
location ~* \.(png|jpg|webp)$ {
add_header Cache-Control "public, max-age=86400, s-maxage=604800";
}
# API 接口默认不缓存
location /api/ {
add_header Cache-Control "no-store";
}
版本化 URL vs 主动 Purge
这是静态资源更新策略的核心选择:
| 维度 | 版本化 URL | 主动 Purge |
|---|---|---|
| 实现方式 | 构建时将 hash 嵌入文件名 | 发布后调用 CDN API 清除缓存 |
| 更新即时性 | 立即生效(新 URL) | 取决于 CDN Purge 生效时间(秒~分钟级) |
| 旧版本保留 | 是,老用户继续访问旧版本 | 否,所有用户强制更新 |
| 出错回滚 | 简单(切回旧 URL 即可) | 复杂(需重新 Purge) |
| 适用对象 | JS / CSS / 字体(内容 hash 稳定) | HTML / 图片 / 数据文件 |
推荐组合:JS/CSS/字体用版本化 URL + max-age=1年;HTML 入口用 no-cache + 发布时 Purge;图片根据是否有版本化流程选择。
Query 参数处理:一个容易踩的坑
很多埋点系统会在 URL 后面拼追踪参数,如 ?utm_source=weibo&utm_campaign=spring。如果 CDN 把完整 URL 作为缓存键,同一个图片的 ?utm_source=weibo 和 ?utm_source=douyin 版本会被存为两份独立缓存,命中率急剧下降。
在 CDN 控制台配置忽略特定 Query 参数(各厂商叫法不同:URL 参数过滤、Query String 忽略):
忽略参数列表:utm_source, utm_medium, utm_campaign, utm_content, utm_term, fbclid, gclid
配置后,CDN 缓存键只保留有业务意义的参数,追踪参数透传给源站但不影响缓存分裂。
五、需要决策:全球化部署
双 CDN 架构
全球化产品无法用单一 CDN 覆盖所有用户,核心矛盾是:国内 CDN 需要 ICP 备案才能在大陆落地节点,海外 CDN(Cloudflare 等)在大陆没有落地节点。解法是双 CDN 架构:国内域名走国内 CDN,海外域名走海外 CDN,在 DNS 层通过 GeoDNS 按用户 IP 分流。
DNS 分流配置(以 Cloudflare DNS 为例):
# 在 Cloudflare 的 DNS 设置中,配置 Geo 策略
# CN 用户解析到阿里云 CDN CNAME
www.example.com CNAME example.cdn.aliyuncs.com [仅 CN 区域]
# 其他用户解析到 Cloudflare CDN
www.example.com CNAME example.pages.dev [默认]
如果在阿里云 DNS(解析套餐),可以直接按线路(电信/联通/移动/海外)配置不同 CNAME。
中国大陆特殊性
ICP 备案是硬门槛。 没有备案不能在大陆落地服务,违规会被直接关停。备案流程:域名实名认证 → 通过云服务商提交备案 → 管局审核(通常 7-20 个工作日)→ 备案号下发。
数据本地化要求。 《数据安全法》和《个人信息保护法》对数据出境有限制,To C 产品存储用户数据的服务必须在国内节点处理,不能通过 CDN 将用户数据路由到境外服务器。CDN 用于静态资源分发通常不触发这一限制,但日志、用户行为数据需要注意。
测速验证很重要。 国内三大运营商互联质量差异很大,同一 CDN 在电信、联通、移动、教育网的表现可能完全不同。接入新 CDN 前,用 17ce.com 或 boce.com 进行全国节点测速,确认各运营商的延迟和稳定性符合预期。
海外合规要点
GDPR(欧盟):欧盟用户的个人数据不得存储在不符合 GDPR 要求的美国服务器上(除非有 SCCs 等合规机制)。选择 CDN 厂商时,确认其在欧盟有节点且数据处理协议合规。Cloudflare 和 AWS 均有 DPA(Data Processing Agreement)可签。
数据主权:部分国家(俄罗斯、印度、越南等)有本地数据存储要求。如果产品面向这些市场,选择在当地有节点的 CDN 供应商,并咨询当地法律合规要求。
多 CDN 的统一运营:双 CDN 带来管理复杂度——两套控制台、两套 Purge 接口、两套监控。建议:
- 封装统一的 Purge 脚本,一次操作同时触发两套 CDN
- 在统一的监控平台收集两套 CDN 的命中率、延迟、错误率数据
- CI/CD 发布流程中自动触发 Purge,不依赖人工操作
六、需要操作:CDN 接入配置
标准接入流程
域名 CNAME 配置:在 CDN 控制台添加加速域名,获得 CDN 厂商提供的 CNAME 地址。在 DNS 服务商将加速域名的解析改为 CNAME 到该地址。DNS 生效时间取决于原 TTL,通常 5 分钟到 1 小时。
源站配置:填写你的源站地址(IP 或域名),配置回源 Host Header(通常与加速域名一致),设置 HTTPS 回源(推荐)。
HTTPS 证书:在 CDN 控制台上传证书或开启自动申请(Let's Encrypt / DigiCert)。CDN 终止 SSL,用户到 CDN 是 HTTPS,CDN 到源站也建议 HTTPS。
缓存规则配置:按文件类型或 URL 规则配置 TTL。通常 CDN 控制台的配置优先级低于源站 Response Header,所以优先通过源站 Header 控制,CDN 规则作为兜底。
测试验证:curl 检查响应 Header 中的
X-Cache字段(各厂商命名不同:HIT/MISS),确认缓存生效:
# 检查是否命中 CDN 缓存
curl -I https://cdn.example.com/static/app.js
# 看 X-Cache: HIT 或 X-Cache-Status: HIT 字段
# Age: 3600 表示该缓存已存在 3600 秒
# 检查 CDN 节点 IP
curl -I --resolve cdn.example.com:443:1.2.3.4 https://cdn.example.com/static/app.js
防盗链配置
防止其他网站直接引用你 CDN 上的资源(白嫖带宽)。在 CDN 控制台配置 Referer 白名单:只允许来自你自己域名的请求,或者配置 Token 鉴权(每个 URL 附带时效性签名)。
Token 鉴权适合需要严格保护的内容(付费视频、私有文件);Referer 限制适合一般静态资源的防盗链(可以被绕过,但能应对大多数情况)。
七、需要操作:日常运维
什么时候需要 Purge
| 场景 | Purge 范围 | 操作方式 |
|---|---|---|
| 发布新版本(HTML 页面更新) | 具体 HTML URL | CI/CD 流程自动触发 |
| 线上数据错误需紧急修复 | 涉及的 URL 或目录 | 手动触发,确认生效 |
| 全量缓存清理(慎用) | 全站 | 只在紧急情况,会瞬间回源压垮源站 |
| 版本化 URL 的 JS/CSS | 不需要 Purge | 新 URL 自动没有缓存 |
Purge 全站是高危操作,执行后所有缓存清空,所有请求涌向源站。在大流量场景,这可能直接打垮源站。如果真的需要全量清理,先确认源站能承受 5-10 倍的正常流量,或者开启 CDN 的"预热"功能提前加载热点资源。
监控哪些指标
| 指标 | 正常范围 | 告警阈值建议 |
|---|---|---|
| 缓存命中率 | 静态资源 > 95% | < 85% 告警,排查缓存配置 |
| 回源率 | < 5%(静态资源) | > 15% 告警,检查 TTL 和缓存键 |
| TTFB(首字节时间) | < 100ms(命中时) | > 300ms 告警 |
| 5xx 错误率 | < 0.1% | > 1% 告警,检查源站 |
| 带宽峰值 | 按业务预期 | 突然翻倍需排查是否遭到攻击 |
各 CDN 厂商均提供实时监控和告警配置,但精细度不一。如果需要跨 CDN 的统一监控,可以将 CDN 厂商的日志导入到自建的日志平台(ELK / ClickHouse)再做 Dashboard。
成本控制
CDN 费用主要来自流量(带宽)和请求次数。降低成本的主要手段:
提高命中率:命中率从 90% 提到 95%,同等用户量下回源流量减少一半,间接降低源站带宽和计算成本。每提升 1% 命中率,在千万 DAU 的产品上可节省可观的费用。
图片压缩和格式优化:开启 CDN 的图片处理功能(WebP 自动转换、按设备分辨率裁剪),同等质量下图片体积减少 30-60%,直接降低带宽消耗。
按需选择加速类型:不是所有内容都需要高速 CDN 节点。大文件下载、备份文件用低价的大容量存储型 CDN;热点小资源用高性能节点。阿里云和腾讯云都提供多个定价档位的 CDN 产品。
流量包 vs 按量付费:如果月流量稳定且量大,购买预付费流量包通常比按量付费便宜 20-30%。量级不确定时按量更灵活。
八、需要操作:故障排查
缓存没生效
- 检查响应 Header 中
Cache-Control是否正确,是否被源站或 CDN 配置覆盖 - 检查
X-Cache字段是否为 HIT(第一次请求必然是 MISS,第二次应为 HIT) - 检查请求是否携带了 Cookie 或 Authorization Header(有这些 Header 时 CDN 通常不缓存)
- 检查 CDN 控制台的缓存规则是否与预期一致,规则优先级是否正确
# 快速诊断:连续两次请求,看 X-Cache 是否变成 HIT
curl -I https://cdn.example.com/static/logo.png
curl -I https://cdn.example.com/static/logo.png
内容更新了用户还看到旧版本
- 确认 Purge 是否已触发并生效(CDN 控制台有 Purge 记录和状态)
- 检查是否有浏览器本地缓存(强刷 Ctrl+Shift+R 或无痕模式测试)
- 确认 Purge 的 URL 与实际请求 URL 完全一致(包括 Query 参数大小写)
- 部分 CDN 的全网 Purge 生效有延迟(30 秒到 5 分钟),等待后再测
某个地区访问慢
- 用多地测速工具(17ce.com / itdog.cn)确认是否只有特定地区慢
- 检查 CDN 该地区节点是否有健康问题(CDN 控制台通常有节点状态页)
- 确认该地区用户被调度到了正确的节点(排查 DNS 解析结果)
- 如果是跨运营商问题(电信用户访问联通节点),联系 CDN 厂商配置运营商调度策略
突发流量源站被打垮
原因通常是 CDN 缓存突然大量失效(全量 Purge、TTL 集中到期)或出现新的热点内容(缓存 MISS 的请求直接穿透到源站)。
应急处置:
- 在 CDN 控制台开启源站保护或回源限速,限制最大回源 QPS
- 对热点资源手动触发 CDN 预热(把内容主动推到边缘节点,减少 MISS)
- 源站开启限流,返回 503 而不是超时,CDN 可以把 503 配置为提供旧缓存(stale-if-error)
使用 CDN 的核心原则:把缓存决策权交给 Cache-Control Header,在构建流程中强制版本化静态资源,在发布流程中自动触发必要的 Purge。配置一次做对,运维成本趋近于零。