跳转至

CDN(Content Delivery Network)

把资源复制到全世界一堆服务器上,用户就近获取——互联网上最基础的加速手段


核心概念

  1. 边缘节点 — CDN 在全球部署的缓存服务器,用户就近访问
  2. 回源 — 边缘节点缓存未命中时,去源站拉取文件
  3. 智能 DNS — 根据用户地理位置将请求导向最近的边缘节点
  4. 静态资源加速 — 图片、JS、CSS、视频等不变的内容最适合上 CDN
  5. 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. 加速

没 CDN:用户(伦敦)→ 上海源站 = 250ms
有 CDN:用户(伦敦)→ 伦敦边缘节点 = 8ms

2. 减轻源站压力

100 万用户 → 99 万次命中边缘节点 → 源站只处理 1 万次回源

99% 的流量被边缘节点消化掉了。

3. 防 DDoS

攻击者打 100Gbps 流量 → 分散到全球几百个边缘节点吸收 → 源站几乎无感

4. HTTPS 终止

边缘节点处理 TLS 握手,到源站可以用 HTTP(内网更快):

用户 ←── HTTPS ──→ CDN 边缘节点 ←── 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

# 1. 把域名的 NS 改成 Cloudflare 的
# 2. 自动开启 CDN
# 3. 拖个滑块选安全级别
# 完事。

常见陷阱

缓存一致性问题

更新了 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,所以内容一定是新的。