CDN 到底是什么?一文搞懂底层原理和接入方案

7 阅读6分钟

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 CloudFrontAWS 生态首选,支持 Lambda@Edge 边缘计算,也支持全站反向代理
Fastly企业级,高度可定制,GitHub、Twitter 等在用

方案二:只加速静态资源,单独 CDN 域名

主站 HTML 还是直连服务器,JS、CSS、图片走另一个 CDN 专用域名。

怎么接入:

  1. 在 CDN 控制台申请一个加速域名,比如 static.example.com,配置回源到你的服务器
  2. 代码里配置静态资源前缀,让静态资源链接自动指向 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 从存储桶里拉,完全不回源到你的服务器。

怎么接入:

  1. 部署脚本里把构建产物中的静态资源目录上传到对象存储桶
  2. 存储桶绑定 CDN 加速域名
  3. 代码里配 assetPrefix 指向 CDN 域名

特点:

  • 静态资源完全不经过你的服务器,服务器压力最小
  • 适合流量极大的场景,或需要多地区分发构建产物的团队
  • 部署流程更复杂,需要维护上传脚本

代表产品:

产品特点
腾讯云 COS + 腾讯云 CDN腾讯云全家桶,搭配顺畅
阿里云 OSS + 阿里云 CDN阿里云全家桶,国内覆盖好
AWS S3 + AWS CloudFrontAWS 生态首选,全球节点多
七牛云 Kodo + 七牛云 FUSION CDN国内 CDN,以对象存储 + CDN 一体为主打

三种方案对比

全站反向代理静态资源单独域名对象存储 + CDN
需要改代码是(assetPrefix)是(assetPrefix + 上传脚本)
接入难度
HTML 也走 CDN
服务器压力中(HTML 还回源)中(静态资源不回源)低(静态资源完全不回源)
适合场景大多数网站已有架构不想大改超大流量或多地区分发

一句话总结

CDN 通过改 DNS,把用户引到最近的节点,节点有缓存直接返回,没有再去服务器拿。

选方案时核心看两点:想加速整个网站还是只加速静态资源,以及能接受多高的接入复杂度。对于大多数网站来说,全站反向代理(Cloudflare 或同类产品)是最简单、收益最大的选择。