CDN(Content Delivery Network)¶
把资源复制到全世界一堆服务器上,用户就近获取——互联网上最基础的加速手段
核心概念¶
- 边缘节点 — CDN 在全球部署的缓存服务器,用户就近访问
- 回源 — 边缘节点缓存未命中时,去源站拉取文件
- 智能 DNS — 根据用户地理位置将请求导向最近的边缘节点
- 静态资源加速 — 图片、JS、CSS、视频等不变的内容最适合上 CDN
- DDoS 防护 — 攻击流量被分散到全球边缘节点吸收
详解¶
没有 CDN 的世界¶
所有用户都直接访问源站服务器:
graph TD
S[源站服务器 上海]
A[用户A 上海 5ms] --> S
B[用户B 北京 30ms] --> S
C[用户C 广州 50ms] --> S
D[用户D 纽约 200ms] --> S
E[用户E 伦敦 250ms] --> S
所有流量挤在一台服务器上,远距离用户体验差,服务器扛不住。
有 CDN 之后¶
graph TD
S[源站 上海]
E1[边缘节点 上海]
E2[边缘节点 北京]
E3[边缘节点 纽约]
E4[边缘节点 伦敦]
S --> E1
S --> E2
S --> E3
S --> E4
A[用户A] --> E1
B[用户B] --> E2
D[用户D] --> E3
E[用户E] --> E4
每个用户都就近访问最近的边缘节点,不直接打源站。
CDN 工作流程¶
sequenceDiagram
participant U as 用户
participant DNS as 智能 DNS
participant E as CDN 边缘节点
participant S as 源站
U->>DNS: 请求 cdn.example.com/logo.png
DNS->>U: 解析到最近的边缘节点 IP
U->>E: GET /logo.png
alt 缓存命中
E->>U: 200 OK + 图片(直接返回)
else 缓存未命中
E->>S: GET /logo.png(回源)
S->>E: 200 OK + 图片
Note over E: 存一份缓存
E->>U: 200 OK + 图片
end
关键点:第一次请求会慢一点(回源),之后就快了。
CDN 缓存了什么?¶
| 适合放 CDN | 不适合放 CDN |
|---|---|
| 图片(logo、banner、产品图) | 用户个人数据 |
| JS / CSS 文件 | 实时交易数据 |
| 视频、音频 | 登录接口 |
| 字体文件 | 搜索接口 |
| 软件安装包、APK | 任何需要实时性的内容 |
简单判断标准:内容不怎么变 + 所有人看到的一样 + 可以缓存 → 适合 CDN。
CDN 核心能力¶
1. 加速¶
2. 减轻源站压力¶
99% 的流量被边缘节点消化掉了。
3. 防 DDoS¶
4. HTTPS 终止¶
边缘节点处理 TLS 握手,到源站可以用 HTTP(内网更快):
缓存策略¶
# Nginx 源站告诉 CDN 怎么缓存
# 静态资源缓存 1 天
Cache-Control: max-age=86400
# 带版本号的资源缓存 1 年
Cache-Control: max-age=31536000, immutable
# 例如 /js/app.v3.2.1.js ← 文件名带版本,变了就是新文件
# 别缓存
Cache-Control: no-cache
# 先检查源站有没有更新
Cache-Control: max-age=300, must-revalidate
CDN 缓存分层:
graph LR
U[用户] --> E[边缘节点<br/>缓存1]
E --> R[区域节点<br/>缓存2]
R --> S[源站<br/>原始文件]
实际配置¶
阿里云 CDN¶
# 1. 控制台添加加速域名
# 加速域名:cdn.example.com
# 回源地址:origin.example.com
# 2. DNS 配置 CNAME
# cdn.example.com → cdn.example.com.w.alikunlun.com
# 3. 缓存规则
# /static/* → 缓存 30 天
# /images/* → 缓存 7 天
# /api/* → 不缓存
Cloudflare¶
常见陷阱¶
缓存一致性问题
更新了 logo.png,但 CDN 还缓存旧的,用户看到旧 logo。解决方案:(1)文件名带版本号 /logo.v2.png;(2)调用 CDN API 强制清除缓存;(3)设置较短的 max-age 等自然过期。
CDN 服务商挂了全挂
过度依赖单一 CDN 有中心化风险。重要业务考虑多 CDN 冗余或回源降级方案。
练习题¶
CDN 的智能 DNS 是怎么知道用户在哪里的?
答案
CDN 的 DNS 服务器会根据**请求来源 IP 的地理位置**(通过 IP 地理位置数据库)来决定返回哪个边缘节点的 IP。这个过程对用户完全透明,用户只需解析域名,CDN 的 DNS 自动帮你选最近的节点。
Cache-Control: immutable 是什么意思?
答案
immutable 告诉浏览器:这个资源永远不会改变,不需要向源站发起条件请求(If-Modified-Since/ETag 验证)。适用于文件名带版本号的静态资源(如 /app.v2.js),版本变了就是新 URL,所以内容一定是新的。