静态资源为什么要走 CDN
一个网站加载慢,很多时候不是服务器慢,而是资源离用户太远——服务器在华北,华南的用户每加载一个图片都要跑几万公里。CDN(内容分发网络)解决的就是这个距离问题:把静态资源提前缓存到离用户近的地方,用户就近取,不用再回源站跑一趟。
对一个静态站点(比如这个技术分享站)来说,图片、CSS、JS 这些资源占了加载大头,走 CDN 之后打开速度立刻能感觉到快一截。这一篇就讲 CDN 到底怎么工作、怎么配才真正有效。
CDN 不是把你的网站搬到云上,而是把你的静态资源"提前摆在用户家门口"。
- 边缘节点CDN 在全国布了一堆缓存节点。
- 命中率命中越高,回源越少,越快越省。
- 缓存策略什么资源缓存多久,是个权衡。
- 缓存刷新内容更新了,怎么让旧缓存失效。
CDN 是什么:边缘节点缓存
CDN 的原理可以想象成:在全国各个城市都摆了一堆"分店"(边缘节点),每个分店都缓存了你网站的静态资源。用户访问时,DNS 把他导到离他最近的那个分店,分店有这份资源就直接给他,不用跑回总店(源站)。
一次 CDN 请求的过程:
1. 用户请求一张图片
2. CDN 节点查自己有没有这份缓存
3. 有 → 直接返回(命中)
4. 没有 → 回源站拉一份,缓存下来,再返回(未命中)
第一次访问某个资源时还是要回源,但一旦缓存住,后面所有用户都从就近节点秒取。源站的压力也跟着小了——大部分请求 CDN 就挡掉了。
缓存命中率:CDN 值不值的关键
衡量 CDN 效果的核心指标是缓存命中率——一百个请求里,有多少个是 CDN 直接命中、没回源的。命中率越高,说明 CDN 真的挡住了流量:
命中率 = 命中次数 / 总请求次数
- 命中率 95%:几乎不回源,源站很轻松
- 命中率 50%:一半请求还在回源,CDN 作用打折
- 命中率很低:说明缓存策略有问题,或资源名字一直在变
命中率上不去,最常见的原因是资源文件名每次发布都变(比如带个新的 hash)。这本身是对的,但要配合正确的缓存策略——文件名变了,浏览器和 CDN 自然会去拿新的,旧缓存也不影响。
缓存策略:缓存多久才合适
缓存时间设多长是个权衡:设太长,内容更新了用户还看到旧的;设太短,缓存不住、回源多。经验法则是按资源类型分:
常见的缓存时长建议:
- 带 hash 的静态资源(app.abc123.js)→ 缓存很久(一年)
因为文件名一变就是新资源,老缓存不用管
- 图片 → 缓存几小时到一天
- HTML 页面 → 缓存很短,或不缓存
因为 HTML 是入口,要让用户看到最新版
记住一个原则:会变的入口(HTML)短缓存,不会变的静态资源(hash 文件)长缓存。这样既快、又能让更新及时生效。
回源:CDN 缓存没有时怎么办
当 CDN 节点上没有这份资源,它会回源站去拉。这里有个隐患:如果大量请求同时回源,源站会被瞬间打满——这叫回源风暴。比如一个热门图片刚发布、所有边缘节点都还没缓存,同一时间一堆请求回源,源站就扛不住了。
缓解办法:CDN 一般会做回源合并——同一个资源多个请求同时未命中,只回源一次,拉回来之后大家一起用。你要做的是别让源站太弱,确保它在回源高峰时也能顶住。
发布后怎么刷新缓存
内容更新了,CDN 上的旧缓存还没过期怎么办?这时候要用缓存刷新(purge)——手动告诉 CDN:这份资源过期了,下次别用旧的、去回源拿新的:
两种刷新方式:
- 按 URL 刷新:只清某几个文件(精准、常用)
- 按目录刷新:清一整个目录(范围大、慎用)
发布流程里通常这样:
部署新版静态文件 → 触发 CDN 缓存刷新 → 用户看到新版
对静态站点来说,一个好实践是:静态资源文件名带内容 hash,这样发新版文件名自然变了,根本不用刷新——新文件就是新 URL,CDN 自动去拿新的。只有 HTML 这种入口文件需要手动刷新一下。这也是为什么现在前端构建都会给资源加 hash。
一套最小 CDN 配置
如果你的站点还没上 CDN,按这个最小路径:
第一步:把静态资源放到 CDN 上
- 注册 CDN 服务,把源站指到你的站点
- 图片、CSS、JS 这些先走 CDN
第二步:配缓存策略
- hash 资源长缓存、HTML 短缓存
第三步:接域名
- 让用户访问的域名 CNAME 到 CDN
第四步:发布时加刷新动作
- 部署完顺手触发一次缓存刷新
观察:命中率上没上 90%、源站压力是不是小了
CDN 这件事,对静态站点是投入小、见效快的优化——不用改代码,接上去用户就觉得快了一大截。和前面讲的性能压测配合:压测发现加载慢,先看是不是静态资源没走 CDN,这往往是最便宜的那一刀。