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

按内容类型做分类决策

内容类型 × 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 倍。


三、需要决策:供应商选型

国内外主流供应商横评

CDN 供应商选型矩阵

国内:阿里云 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 覆盖所有用户,核心矛盾是:国内 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 接入配置

标准接入流程

  1. 域名 CNAME 配置:在 CDN 控制台添加加速域名,获得 CDN 厂商提供的 CNAME 地址。在 DNS 服务商将加速域名的解析改为 CNAME 到该地址。DNS 生效时间取决于原 TTL,通常 5 分钟到 1 小时。

  2. 源站配置:填写你的源站地址(IP 或域名),配置回源 Host Header(通常与加速域名一致),设置 HTTPS 回源(推荐)。

  3. HTTPS 证书:在 CDN 控制台上传证书或开启自动申请(Let's Encrypt / DigiCert)。CDN 终止 SSL,用户到 CDN 是 HTTPS,CDN 到源站也建议 HTTPS。

  4. 缓存规则配置:按文件类型或 URL 规则配置 TTL。通常 CDN 控制台的配置优先级低于源站 Response Header,所以优先通过源站 Header 控制,CDN 规则作为兜底。

  5. 测试验证: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%。量级不确定时按量更灵活。


八、需要操作:故障排查

缓存没生效

  1. 检查响应 Header 中 Cache-Control 是否正确,是否被源站或 CDN 配置覆盖
  2. 检查 X-Cache 字段是否为 HIT(第一次请求必然是 MISS,第二次应为 HIT)
  3. 检查请求是否携带了 Cookie 或 Authorization Header(有这些 Header 时 CDN 通常不缓存)
  4. 检查 CDN 控制台的缓存规则是否与预期一致,规则优先级是否正确
# 快速诊断:连续两次请求,看 X-Cache 是否变成 HIT
curl -I https://cdn.example.com/static/logo.png
curl -I https://cdn.example.com/static/logo.png

内容更新了用户还看到旧版本

  1. 确认 Purge 是否已触发并生效(CDN 控制台有 Purge 记录和状态)
  2. 检查是否有浏览器本地缓存(强刷 Ctrl+Shift+R 或无痕模式测试)
  3. 确认 Purge 的 URL 与实际请求 URL 完全一致(包括 Query 参数大小写)
  4. 部分 CDN 的全网 Purge 生效有延迟(30 秒到 5 分钟),等待后再测

某个地区访问慢

  1. 用多地测速工具(17ce.com / itdog.cn)确认是否只有特定地区慢
  2. 检查 CDN 该地区节点是否有健康问题(CDN 控制台通常有节点状态页)
  3. 确认该地区用户被调度到了正确的节点(排查 DNS 解析结果)
  4. 如果是跨运营商问题(电信用户访问联通节点),联系 CDN 厂商配置运营商调度策略

突发流量源站被打垮

原因通常是 CDN 缓存突然大量失效(全量 Purge、TTL 集中到期)或出现新的热点内容(缓存 MISS 的请求直接穿透到源站)。

应急处置:

  1. 在 CDN 控制台开启源站保护回源限速,限制最大回源 QPS
  2. 对热点资源手动触发 CDN 预热(把内容主动推到边缘节点,减少 MISS)
  3. 源站开启限流,返回 503 而不是超时,CDN 可以把 503 配置为提供旧缓存(stale-if-error)

使用 CDN 的核心原则:把缓存决策权交给 Cache-Control Header,在构建流程中强制版本化静态资源,在发布流程中自动触发必要的 Purge。配置一次做对,运维成本趋近于零。

加载导航中...

评论