CDN 是怎么把内容搬到你家门口的
你打开一个托管在弗吉尼亚的站点,图片却可能来自天津的某台机器。这篇讲 CDN 的三件事、为什么缓存命中率是唯一重要的指标、边缘节点除了缓存还能干什么,以及 CDN 为什么非要挤进互联网交换中心。
一个站点托管在弗吉尼亚,你在北京打开它,页面里的图片却可能是从天津某台机器发出来的。这不是镜像站,是 CDN —— 内容分发网络。
它做的事说起来很简单:把内容提前搬到离用户近的地方。但真正让它变复杂的,是「提前搬到哪」「怎么知道用户在哪」和「搬错了怎么办」。

图片来源:Derrick Coetzee,CC0,来自 Wikimedia Commons。
三件事:缓存、就近、回源
CDN 的全部机制可以拆成三个动作:
| 动作 | 做什么 | 关键问题 |
|---|---|---|
| 缓存 | 把内容存在边缘节点上 | 存多久、什么时候作废 |
| 就近 | 把用户导向最近的节点 | 怎么判断「最近」 |
| 回源 | 边缘没有就去源站取 | 回源会不会把源站打垮 |
这三件事里,只有第一件是省钱省时间的,后两件是兜底。一个 CDN 好不好,看的就是它的缓存命中率有多高、以及命中不了的时候兜得稳不稳。
缓存命中率是唯一重要的指标
命中率 = 边缘直接响应的请求 / 总请求。这个数字的威力被严重低估:
- 命中率 90% → 每 100 个请求有 10 个回源;
- 命中率 99% → 每 100 个请求只有 1 个回源。
看起来只差 9 个百分点,回源流量差了整整 10 倍。而回源流量是要花钱的 —— 它走的是源站带宽,还带着延迟。
命中率上不去,通常是这几个原因:
- 缓存键太细。默认的缓存键包含完整 query string,而很多站点会往 URL 上挂一堆跟踪参数(
?utm_source=...&gclid=...)。同一个图片在缓存里被存成几十份,每份只被命中一次。解法是配置忽略哪些参数。 - TTL 太短。设成 60 秒,等于每 60 秒就要回源一次。静态资源完全可以用内容哈希做文件名,然后设成一年不可变。
- Cookie 或
Vary把它打散。请求带Cookie时很多 CDN 默认不回缓存,Vary: User-Agent更是灾难 —— 每个浏览器版本一份缓存。 - 源站没给对响应头。
Cache-Control: private或no-store会让 CDN 直接放弃。
反过来,作废(purge)是必须准备的。发版时文件名带哈希就不用管;但一个被误标成长期缓存的 config.json,能让你在发布后半小时里看着旧配置干瞪眼。

图片来源:Preston Keres / USDA,公有领域,来自 Wikimedia Commons。
边缘不只是缓存
现代 CDN 的边缘节点早就不止做缓存了。它通常是这些角色:
- TLS 终结:握手在边缘完成,源站只处理明文或一条长连接。证书由 CDN 统一管理,OCSP stapling 也在边缘做;
- 协议升级:HTTP/3、Brotli 压缩这些都需要两端配合,边缘能比源站更快跟上;
- WAF 与 Bot 管理:把攻击流量挡在源站之外,这是 CDN 最容易被低估的价值 —— 它同时是抗 DDoS 的第一层;
- 图片转码:按
Accept头或 URL 参数在边缘生成 WebP / AVIF 缩略图,源站只存原图; - 边缘函数:在节点上跑一小段代码做重写、A/B 测试、鉴权。
把这些都算上,「CDN」这个名字已经不太准确了 —— 它更像是一个离用户最近的代理层。
「就近」是怎么算出来的
两种主流机制,经常一起用:
DNS 调度。 权威 DNS 根据递归解析器的位置返回不同的 IP。简单有效,但有个先天缺陷:递归解析器(比如 8.8.8.8)和真实用户可能隔着半个地球,按解析器的位置调度会指错。于是有了 EDNS Client Subnet —— 解析器把用户网段的前缀带进查询,权威服务器据此返回更准的结果。
Anycast。 同一个 IP 在多个节点上同时宣告,由 BGP 决定流量走哪条路。对用户来说永远是「同一个地址」,实际落点由路由表决定。它天然抗 DDoS(流量被分散)和天然容灾(一个节点挂了,路由收敛到别的节点)。

图片来源:Fabienne Serriere,CC BY-SA 3.0,来自 Wikimedia Commons。
为什么要挤进交换中心
节点建好了,还得有路走。互联网不是一张均匀的网,网络之间的连接分两种:
- transit(转接):付费买别人的网络帮你转发,按带宽计费;
- peering(对等):两家网络免费互换彼此之间的流量。
CDN 的流量绝大部分是「下行给用户」,也就是它发出去的多、收回来的少。这种流量模式在商业上很有优势 —— 运营商愿意免费对等,因为用户想看的内容就在 CDN 里。
而对等谈判发生的物理地点就是互联网交换中心(IX),比如阿姆斯特丹的 AMS-IX、法兰克福的 DE-CIX。一家 CDN 在多少个 IX 里有端口,直接决定了它能免费覆盖多少用户。所以「挤进 IX」不是技术洁癖,是实打实的成本结构。
我的判断
个人站点用 CDN,最容易犯的错是只盯着「加速」。其实对一个小站来说,CDN 更值钱的是另外两件事:
- 把源站的 IP 藏起来。源站直接暴露,被扫到就是无止境的爬虫和攻击;
- 免费 HTTPS 与抗量。证书自动续期、几百 Gbps 的 DDoS 挡在前面,这些自建要花多少钱多少精力,不用算。
至于真正的「就近加速」—— 如果你的服务器本来就在目标用户所在的国家,收益远没有宣传的那么大。先搞清楚自己在买什么,再决定要不要买。

评论
…