CDN 是什么,怎么用
大白话讲清楚 CDN 的底层逻辑,以及想接入 CDN 时有哪些方案可选。
CDN 解决什么问题
你的网站服务器放在北京,一个广州用户访问,数据要跑 2000 公里。一个纽约用户访问,要跑 1 万公里。距离越远,速度越慢。
CDN 的思路很简单:把内容提前搬到离用户近的地方。
就像便利店的逻辑——东西不从工厂直发,而是提前铺货到每个街道,你走两步就能拿到。
底层是怎么运转的
第一步:用户输入网址,先问 DNS
DNS 是互联网的电话簿,把域名翻译成真实的服务器 IP 地址。
没有 CDN 时:
用户问:example.com 在哪?
DNS 答:在 123.45.67.89(你的服务器)
用户直接连那台服务器
有 CDN 时,DNS 记录被改掉了:
用户问:example.com 在哪?
CDN 的 DNS 收到问题,看了一眼用户的 IP,判断他在广州
CDN 答:去 203.x.x.x(广州节点)
用户连的是广州节点,不是北京服务器
这一步是关键——通过 DNS 把用户悄悄引到最近的节点,用户完全感知不到。
第二步:CDN 节点决定怎么响应
用户请求到了广州节点,节点做一个判断:
这个内容我有缓存吗?
有 → 直接返回,北京服务器完全不知道这次请求
没有 → 去北京服务器拿,拿回来缓存好,再返回给用户
第一个用户访问时要回北京拿,之后广州所有用户都直接从广州节点拿,北京服务器的压力大幅下降。
第三步:缓存多久,听 Cache-Control 的
服务器返回内容时,会带一个 Cache-Control 头,告诉 CDN 节点这个内容能缓存多久:
Cache-Control: max-age=86400 → 缓存 1 天
Cache-Control: no-store → 不许缓存,每次都回源
Cache-Control: max-age=31536000, immutable → 缓存 1 年,内容绝对不变
CDN 按这个规则执行。也可以在 CDN 控制台设规则强制覆盖,让 CDN 自己决定缓多久,不依赖服务器的头。
浏览器缓存 vs CDN 缓存,是两回事
很多人容易混淆这两层:
北京服务器
↓ 返回内容 + Cache-Control
CDN 广州节点(边缘缓存)—— 全广州用户共享
↓ 透传内容 + Cache-Control
用户浏览器(本地缓存)—— 只有你自己用
同一个 Cache-Control 头,CDN 和浏览器都会读,但各自独立执行:
- CDN 缓存到节点机器上,影响所有用户
- 浏览器缓存到你自己电脑上,只影响你
CDN 侧可以在控制台单独配规则覆盖边缘缓存策略,默认不影响下发给浏览器的头。但部分 CDN(如 Cloudflare)支持 Browser TTL Override,开启后也能修改浏览器收到的 Cache-Control,进而影响浏览器缓存行为。
开发时只需要把 Cache-Control 设对,CDN 是部署层面的事,两者职责清晰分开。
想接入 CDN,有哪些方案
方案一:全站反向代理
把整个网站的流量都走 CDN,CDN 站在用户和服务器中间。HTML、JS、CSS、图片全部过 CDN。
怎么接入:
把域名 DNS 记录改为指向 CDN,流量自动走 CDN 节点:
改之前:example.com A记录 → 你的服务器 IP
改之后:example.com CNAME → CDN 给的地址
或者把域名的 NS(域名解析权)整体交给 CDN 管理(如 Cloudflare),控制力更强。
特点:
- 不需要改任何代码
- 所有请求(包括 HTML)都过 CDN,可按内容类型灵活控制缓存
- CDN 还能顺带提供安全防护(DDoS、WAF 等)
代表产品:
| 产品 | 特点 |
|---|---|
| Cloudflare | 全球使用最广泛的反向代理 CDN,免费套餐可用,接管 NS |
| 腾讯云 EdgeOne | 腾讯出品,支持全站加速 + 边缘函数 + 安全防护 |
| 阿里云 DCDN | 动静态内容统一加速,适合动态内容多的站点 |
| AWS CloudFront | AWS 生态首选,支持 Lambda@Edge 边缘计算,也支持全站反向代理 |
| Fastly | 企业级,高度可定制,GitHub、Twitter 等在用 |
方案二:只加速静态资源,单独 CDN 域名
主站 HTML 还是直连服务器,JS、CSS、图片走另一个 CDN 专用域名。
怎么接入:
- 在 CDN 控制台申请一个加速域名,比如
static.example.com,配置回源到你的服务器 - 代码里配置静态资源前缀,让静态资源链接自动指向 CDN 域名
以 Next.js 为例:
// next.config.ts
assetPrefix: 'https://static.example.com'
构建后 JS/CSS 的链接变成:
https://static.example.com/static/chunks/xxx.js
特点:
- 静态资源走 CDN,动态接口请求仍直连服务器
- 需要改少量代码配置
- CDN 只拉取静态文件,不介入 HTML 响应
代表产品:
| 产品 | 特点 |
|---|---|
| 腾讯云 CDN | 国内节点覆盖广,适合面向中国大陆用户的站点 |
| 阿里云 CDN | 阿里云生态,与 OSS 搭配顺畅 |
| 又拍云 | 国内 CDN,提供图片处理等增值能力 |
| BunnyCDN | 价格便宜,配置简单,适合独立开发者 |
方案三:对象存储 + CDN
把构建产物主动上传到对象存储(COS / OSS / S3),CDN 从存储桶里拉,完全不回源到你的服务器。
怎么接入:
- 部署脚本里把构建产物中的静态资源目录上传到对象存储桶
- 存储桶绑定 CDN 加速域名
- 代码里配
assetPrefix指向 CDN 域名
特点:
- 静态资源完全不经过你的服务器,服务器压力最小
- 适合流量极大的场景,或需要多地区分发构建产物的团队
- 部署流程更复杂,需要维护上传脚本
代表产品:
| 产品 | 特点 |
|---|---|
| 腾讯云 COS + 腾讯云 CDN | 腾讯云全家桶,搭配顺畅 |
| 阿里云 OSS + 阿里云 CDN | 阿里云全家桶,国内覆盖好 |
| AWS S3 + AWS CloudFront | AWS 生态首选,全球节点多 |
| 七牛云 Kodo + 七牛云 FUSION CDN | 国内 CDN,以对象存储 + CDN 一体为主打 |
三种方案对比
| 全站反向代理 | 静态资源单独域名 | 对象存储 + CDN | |
|---|---|---|---|
| 需要改代码 | 否 | 是(assetPrefix) | 是(assetPrefix + 上传脚本) |
| 接入难度 | 低 | 中 | 高 |
| HTML 也走 CDN | ✅ | ❌ | ❌ |
| 服务器压力 | 中(HTML 还回源) | 中(静态资源不回源) | 低(静态资源完全不回源) |
| 适合场景 | 大多数网站 | 已有架构不想大改 | 超大流量或多地区分发 |
一句话总结
CDN 通过改 DNS,把用户引到最近的节点,节点有缓存直接返回,没有再去服务器拿。
选方案时核心看两点:想加速整个网站还是只加速静态资源,以及能接受多高的接入复杂度。对于大多数网站来说,全站反向代理(Cloudflare 或同类产品)是最简单、收益最大的选择。