跳到主要内容

CDN 原理与应用

CDN 是建站实践里最常见的性能设施之一,但它真正重要的地方不在“全球节点”这句广告词,而在于你是否理解:

  • 什么内容适合缓存
  • 缓存命中和回源到底意味着什么
  • 为什么同一个站点里有的资源应该长缓存,有的绝不能缓存

这篇要解决什么

一句话版本:CDN 不是神秘加速器,它本质上是“把适合重复读取的内容提前分发到离用户更近的地方”。

什么是 CDN

CDN 是 Content Delivery Network,内容分发网络。

你可以把它理解成站在用户和源站之间的一层:

  • 用户先访问 CDN 节点
  • 节点如果有缓存,就直接返回
  • 节点没有缓存,才去源站取内容
  • 取到后再按规则决定是否缓存

为什么建站时经常要接 CDN

一个网站的很多资源天然适合被重复访问:

  • HTML 页面
  • 图片
  • CSS
  • JavaScript
  • 字体文件
  • 下载文件

如果每次都回源站,不仅慢,也会给源站增加无谓压力。CDN 的价值就在于把这些“高复用内容”尽量挡在边缘层处理掉。

CDN 如何工作

一个最小流程通常是:

  1. 用户请求 https://example.com/logo.png
  2. CDN 节点先查本地有没有这份缓存
  3. 如果命中,直接返回给用户
  4. 如果没命中,CDN 回源到你的对象存储、静态托管平台或服务器
  5. 源站返回资源后,CDN 再决定是否缓存,以及缓存多久

这里最关键的两个词是:

  • 缓存命中:节点本地有可用副本
  • 回源:节点本地没有,需要向源站重新拿

适合使用 CDN 的内容类型

静态内容

  • 图片、视频、音频
  • CSS、JavaScript、字体
  • 静态 HTML
  • PDF、压缩包、安装包等下载资源
  • 静态站生成器的构建产物

这类内容最适合 CDN,因为它们通常更新频率不高、用户间差异小、重复读取概率高。

哪些内容不能简单长缓存

下面这些内容要更小心:

  • 用户个人资料页
  • 购物车、订单、结算页
  • 后台管理页面
  • 带登录态的 API
  • 依赖 Cookie、Authorization 或地区的页面

静态内容接入 CDN 的常见步骤

1. 明确源站类型

先确认你后面接的到底是:

  • 静态托管平台
  • 对象存储
  • 自建服务器
  • 动态应用服务

2. 配置 DNS

把域名解析指向 CDN 提供商指定的地址。常见形式是添加一条 CNAME 记录:

www.example.com CNAME cdn.example-cdn.com

3. 配置缓存规则

至少要明确:

  • 哪些路径缓存
  • 缓存多久
  • 哪些参数参与缓存键
  • 哪些请求必须绕过缓存

4. 检查源站响应

确认源站返回的状态码、内容类型和缓存头都合理。

5. 测试缓存命中

通过浏览器开发者工具或响应头检查资源是否真的经过 CDN,以及是否发生命中。

你真正要理解的缓存头

  • Cache-Control: public, max-age=31536000 适合带版本号的静态资源
  • Cache-Control: public, max-age=300 适合短时间可复用的公开内容
  • Cache-Control: private 更偏向浏览器私有缓存
  • Cache-Control: no-store 表示不要缓存

最容易踩的坑

1. 把 HTML 和静态资源设成同样的长缓存

这样最容易出现“页面结构已经变了,但入口还是旧的”问题。

2. 忘记版本控制

静态资源如果没有文件名哈希、版本号或明确刷新策略,就很难安全地长缓存。

3. 把登录态页面缓存成公共内容

轻则显示错页面,重则造成信息泄露。

4. 看到 CDN 就以为源站可以随便配

CDN 不是万能补丁。源站的缓存头、内容类型、压缩和响应码都仍然重要。

总结

CDN 的核心不是“神秘地加速”,而是:

  • 让适合缓存的内容尽量不回源
  • 让不适合缓存的内容也能更稳定地经过边缘层
  • 用缓存策略把性能和正确性同时守住

适合接着读什么