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 多个。
运作流程是这样:
- 你把网站的静态资源(图片、CSS、JS)上传到 CDN 厂商的源站
- 用户访问你的网站时,DNS 解析到离用户最近的 CDN 节点
- 如果这个节点上有缓存的内容——直接返回(命中缓存)
- 如果这个节点上没有——节点向你的源站请求内容,缓存下来,再返回给用户(回源)
- 后续用户再请求同样的内容——直接从缓存返回
这个过程里最关键的三个技术:
智能 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。纯动态 + 用户集中 = 浪费钱。