CDN 基础:架构、节点、分发与缓存

聊到 CDN,很多同学第一反应就是「加速」。但背后的原理,说白了就是 内容离用户越近,响应越快。我刚开始接触 CDN 时,以为它就是个高级缓存代理,后来踩过几次坑才明白,架构设计、节点布局、缓存策略环环相扣。今天咱们把这几个核心掰开了聊聊。

CDN 的整体架构

先看一张经典的三层模型。最外层是 边缘节点,中间是 区域中心,最里面是 源站。用户请求打到边缘,边缘没有缓存就向上层要,层层回源。你可能会问,为什么不直接回源?
原因很简单——源站扛不住啊。我在项目中就见过,某活动流量突增,源站直接被冲垮,后来加了 CDN 边缘层,95% 的请求在边缘就响应了。

核心组件
• 边缘节点:分布各地,存储热点内容,直接服务用户
• 调度系统:根据用户 IP 和节点负载,返回最优节点 IP
• 回源层:缓存未命中时从源站拉取内容,并同步更新

下面是 CDN 核心架构图,我习惯把调度、边缘、源站之间的数据流向画清楚。

CDN 核心架构流程图 CDN 请求处理流程 用户客户端 DNS 调度器 边缘节点 1 边缘节点 2 源站 边缘缓存策略 TTL 命中 → 直接返回 未命中 → 回源拉取并缓存

边缘节点与内容分发原理

边缘节点为啥能加速?本质是 就近 + 缓存。用户访问时,DNS 调度返回离他最近的边缘节点 IP。如果那个节点上存了用户要的内容,直接返回,延迟通常 < 10ms。如果没存呢?节点会向上一层或源站拉取,同时把内容存下来,下次就不找了。

这里的「分发」分两种模式:

  • 主动推送:源站更新内容后,直接推给所有边缘节点。适合静态图片、视频等。
  • 被动回源:用户触发才拉取,第一次慢,后续快。适合动态页面或长尾内容。
个人经验
我遇到过有人把所有内容都走被动回源,结果活动上线时边缘节点全部同时回源,源站 CPU 瞬间 100%。后来改为预热推送,提前把热点内容推到边缘,才稳定下来。

缓存策略:让效率翻倍的核心

缓存策略说白了就三个问题:存多久?怎么更新?一致性能接受多少?

策略原理适用场景坑点
强制缓存(Cache-Control)设置 max-age,到期前直接返回本地副本图片、CSS、JS 等静态资源更新后用户不刷新看不到新内容
协商缓存(ETag / Last-Modified)每次携带标记到边缘验证,未过期返回 304HTML、API 响应验证请求占比高时边缘成本增加
多级缓存(L1→L2→源站)热数据在 L1,温数据在 L2,冷数据回源大流量高并发场景各级缓存命中率需要持续调优
分层 TTL边缘短 TTL(如 5 分钟),中间层长 TTL(如 1 小时)新闻资讯、排行榜用户可能拿到旧数据,需结合版本号
曾经踩过的坑
我曾经给某客户配置了全局 max-age=86400,结果版本更新后用户一直看到老页面。后来我们在 URL 后面加版本参数(如 style.css?v=2),强制边缘节点以为它是新资源。这是最省心的做法。

缓存刷新也是个技术活。全量刷新容易打回源,增量刷新又可能漏掉。我一般按 目录级别 + 正则 刷新,比如只刷新 /images/ 下的图片,避免影响其他文件。

代码示例:Nginx CDN 缓存配置片段

# 边缘节点缓存配置示例
proxy_cache_path /data/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;
server {
    listen 80;
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;   # 200/302 缓存 10 分钟
        proxy_cache_valid 404 1m;        # 404 只缓存 1 分钟
        proxy_cache_use_stale error timeout updating;  # 回源失败时使用过期缓存
        add_header X-Cache-Status $upstream_cache_status;
        proxy_pass http://backend;
    }
}

看到这里你可能会问:配置里 proxy_cache_use_stale 是什么?说白了就是当边缘节点回源出错时,允许返回过期的缓存,保证用户至少能拿到内容,而不是直接 502。这个开关在生产环境里非常关键。

小结:核心要点

  • CDN 本质是 空间换时间——使用大量边缘存储换取用户端响应速度
  • 缓存策略的核心变量是 TTL 时长、更新粒度、一致性容忍度
  • 多级缓存可以减小回源压力,但要增加监控和命中率分析

记得我刚入行时,总想把所有内容缓存时间设得很长,后来被老板骂过才明白:缓存是双刃剑,快是真的快,脏数据也是真的麻烦。好,这一章就先讲到这里,你可以在实际项目里对照着看看自己的 CDN 配置哪里还有优化空间。