CDN 为什么能让网站变快?所有你想知道的都在这里

你有没有想过:一个网站在美国,你在北京打开它——数据要横跨太平洋,走一万多公里的海底光缆。物理距离决定了延迟至少 100-200ms。但如果这个网站接了 CDN,你在北京打开可能只要 10ms。

这中间发生了什么?

CDN 到底做了什么

CDN(Content Delivery Network,内容分发网络)的核心思想很简单:把你网站的内容复制到离用户最近的服务器上,用户访问离他最近的节点,而不是回源站。

假设你的网站服务器在上海。一个广州用户访问你的网站:

不用 CDN: 广州 → 上海(约 30ms)

用 CDN: 广州 → 广州 CDN 节点(约 5ms)

差距看起来不大,但如果你有一张高清图片(2MB),不用 CDN 要走 30ms 的网络延迟 + 传输时间。用 CDN,图片已经在广州节点的硬盘上了,读取 + 传输几乎瞬间完成。

对静态资源(图片、CSS、JS、视频)来说,CDN 的加速效果立竿见影。

CDN 的工作原理

CDN 厂商在全球部署了大量服务器节点。以阿里云 CDN 为例,国内有 2000 多个节点,海外有 500 多个。

运作流程是这样:

  1. 你把网站的静态资源(图片、CSS、JS)上传到 CDN 厂商的源站
  2. 用户访问你的网站时,DNS 解析到离用户最近的 CDN 节点
  3. 如果这个节点上有缓存的内容——直接返回(命中缓存)
  4. 如果这个节点上没有——节点向你的源站请求内容,缓存下来,再返回给用户(回源)
  5. 后续用户再请求同样的内容——直接从缓存返回

这个过程里最关键的三个技术:

智能 DNS 解析。 CDN 厂商的 DNS 服务会根据用户的 IP 地址判断他的地理位置,然后返回最近的 CDN 节点的 IP。北京的访客解析到北京节点,广州的访客解析到广州节点。

缓存策略。 CDN 节点不会永久缓存你的文件。你可以设置缓存时间(Cache-Control 头)——比如图片缓存 30 天,HTML 缓存 1 分钟。缓存过期后,节点会重新回源拉取最新版本。

预热。 如果你的网站刚接入 CDN,节点上没有任何缓存。你可以提前把热门文件推送到所有节点——这叫做"预热"。预热之后,用户访问任何一个节点都能直接命中缓存。

CDN 的优点

速度快。 物理距离缩短,延迟低,带宽充足。这是最直接的好处。

减轻源站压力。 如果你的网站日访问量 100 万,图片全走源站——源站带宽直接爆炸。接入 CDN 后,99% 的图片请求被 CDN 节点挡住,源站只需处理极少量的回源请求。

抗 DDoS。 CDN 节点遍布全球,天然具备分布式抗攻击能力。小规模的 DDoS 在 CDN 层面就被吸收了,根本到不了你的源站。

高可用。 你的源站挂了,CDN 节点还有缓存内容可以继续提供服务。用户感知不到源站宕机。

HTTPS 加速。 很多 CDN 厂商在节点上做了 SSL 卸载——HTTPS 的握手和加解密在边缘节点完成,用户到节点之间是加密的,节点到源站之间也可以走专线加速。

CDN 的缺点

成本。 CDN 按流量计费。一天 10GB 流量可能还好,如果你的网站有视频,一天 10TB 流量——那账单会很难看。国内 CDN 大概 0.2-0.3 元/GB,国际 CDN(比如 Cloudflare)有免费版但功能受限。

缓存问题。 你更新了一个 CSS 文件,但用户看到的是旧的缓存版本——因为 CDN 节点还没过期。你需要手动刷新缓存或者用版本号(style.v2.css)来规避。

配置复杂度。 缓存规则没配好可能导致不该缓存的内容被缓存了(比如用户登录后的个人信息),或者该缓存的内容没缓存。

不适合动态内容。 CDN 对静态资源的加速效果最好。纯动态内容(比如实时聊天、股票行情)走 CDN 反而可能变慢——多了 CDN 这一层跳转。

国内特殊问题。 国内 CDN 需要域名备案。没备案的域名不能接入国内 CDN 节点。所以个人博客如果不想备案,只能用海外 CDN(Cloudflare)。

为什么有人用了 CDN 反而变慢了

这种情况比你以为的更常见。原因有几种:

回源太远。 假设你的源站在美国,CDN 节点在中国。用户第一次访问一个文件时,CDN 节点需要从美国拉取——这个"第一次"比直接访问源站还慢,因为多了 CDN 这一跳。但如果文件被缓存之后,后续访问就快了。

选错节点区域。 CDN 厂商一般让你选"中国大陆"“亚太”“全球"等加速区域。你的用户主要在亚洲,但你把加速区域选成了"全球”——部分请求可能被路由到欧洲节点,反而更慢。

动态内容走 CDN。 如果你的页面内容是实时生成的(比如个性化推荐、登录后的用户界面),这些内容不能被 CDN 缓存。每次请求都要回源——本来用户直连源站只要 20ms,现在多了 CDN 这一跳变成了 25ms。快了谁?谁也没快。

CDN 节点本身慢。 便宜的小 CDN 厂商节点少、带宽小、覆盖差——用户"就近"访问的节点可能也离他几百公里。

哪些网站必须用 CDN

  • 大流量网站。 日 PV 超过 10 万,不上 CDN 源站带宽根本扛不住。
  • 面向全国的网站。 你的用户分布在各个省份,需要就近加速。
  • 视频/图片网站。 静态资源大、请求多,CDN 是最性价比的选择。
  • 面向海外的网站。 你的服务器在国内,用户在国外——中间隔了 GFW 和跨国网络瓶颈。CDN 海外节点能大幅改善体验。

哪些网站没必要用 CDN

  • 纯内网系统。 公司 OA、内部管理系统——用户就在局域网里,CDN 没用。
  • 小流量个人博客。 一天几百个访问,源站 1Mbps 带宽都吃不满,加 CDN 多花钱没意义。Cloudflare 免费版除外——免费的不吃亏。
  • 纯动态网站。 每个页面都是实时生成的,CDN 没法缓存——每请求都回源,加速效果几乎为零。
  • 用户都在同一个城市的本地服务。 你是杭州的一个本地生活网站,用户全是杭州的——CDN 节点也在杭州,和源站延迟差不多,意义不大。

国内外 CDN 厂商怎么选

厂商 类型 免费版 国内节点 海外节点 适合
阿里云 CDN 国内 ✅ 2000+ ✅ 500+ 面向国内的大中型网站
腾讯云 CDN 国内 ✅ 2000+ 面向国内的网站,腾讯生态
七牛云 国内 ✅ 10GB 个人开发者、小团队
又拍云 国内 ✅ 有额度 个人开发者、图片处理强
Cloudflare 海外 ✅ 免费 ❌(需备案) ✅ 300+ 个人博客、海外站点
AWS CloudFront 海外 ✅ 1TB/月 ✅ 400+ 海外业务、AWS 生态用户
Fastly 海外 海外中大型站点、极致性能

国内用户选 CDN 的建议:

  • 面向国内用户 + 有备案: 阿里云 CDN 或腾讯云 CDN。节点最多,速度快。
  • 面向国内用户 + 没备案: Cloudflare 海外节点。虽然节点不在国内,但相比直连海外源站还是快不少。
  • 面向海外用户: Cloudflare 免费版足够。全球节点覆盖广,不需要花钱。
  • 图片处理需求: 七牛云或又拍云——它们的图片处理(裁剪、压缩、水印、格式转换)集成得最好。

最后

CDN 不是"用了就一定会快"的银弹。它是"在合适的场景下好用,在不合适的场景下白花钱甚至负优化"的工具。

判断一个网站该不该上 CDN 的标准很简单:你的静态资源有多少、你的用户分布有多广。

静态资源多 + 用户遍布各地 = 必须上 CDN。纯动态 + 用户集中 = 浪费钱。

一名痴迷于计算机技术的学生~