关于 CDN,常见的两种说法都不完整:一种说"必须上,不上就是落后";另一种说"小网站没必要,纯属多花钱"。真实答案是——它取决于你的页面构成和用户分布,而且不管上不上,都必须先想清楚一件事:CDN 挂了会怎样。

一、CDN 省的是什么,不省什么

CDN 的本质是把静态资源(图片、CSS、JS、视频)复制到离用户更近的节点上,用户就近取。它省的是两件事:跨地域访问的延迟,和源站的带宽压力。

它不省的是:程序逻辑的耗时、数据库查询、服务端渲染。如果你的网站打开慢是因为后端接口慢,上 CDN 基本没用。这个判断先做对,能省下不少冤枉钱。

还有一个常被忽略的点:CDN 的收益大小,取决于缓存命中率。文件名固定、内容不变的老图,命中率会很高,效果立竿见影;但如果你的图片地址每次都带随机参数,或者资源天天改版本号,命中率上不去,等于花钱买了一趟绕路。

二、三个判断指标

指标怎么看倾向
媒体资源占比首页图片、视频总体积 > 2MB,或图片数量 > 20 张建议上
用户地理分布访客集中在本地(如同城)且源站也在本地可不上
源站带宽上限带宽是 1–5Mbps 的小配置,且有大图建议上

这三个指标怎么测?打开首页按 F12 看网络面板就行:把图片和视频的传输体积加起来,看看有多少条请求、总共多少 MB;再对照一下你的源站带宽规格。我们自己的站属于前者——首页引用的资源里,有二十多项是图片和图标,这种情况源站带宽再便宜,也会在并发上来时先卡在图片上。

三、被忽略的另一面:CDN 也是单点

这里有个真实教训。做资源体检时我们统计了自家首页的资源来源,结果是:39 个外部资源里,23 个指向 CDN 域名,而本地目录里并没有留这些文件的副本。

这意味着什么?——CDN 一旦故障或配置出错,页面不是"变慢",而是logo、配图、二维码全部变成裂图,用户看到的是一张残缺的页面。对做生意的官网来说,这比慢几秒严重得多。

更麻烦的是排查成本。因为地址是写在数据库和模板里的,真出事时你得先定位哪些引用了 CDN、再决定是改配置还是改数据,一来一回可能就是一小时。

所以问题不该是"要不要上 CDN",而是"上了 CDN 之后,怎么保证它出问题时不至于全站陪葬"。

四、本地兜底预案,三步

1. 关键资源本地留底

品牌 logo、favicon、二维码这类"没它就白屏"的素材,在源站的 public 目录里保留一份同名副本。体积极小——我们把十个品牌素材全部留底,加起来不到 300KB,换来的是一份随时可用的退路。

2. 做一个能一键切换的开关

后台加一个"启用 CDN"开关。关闭时,前台渲染的所有资源地址自动从 CDN 域名替换为源站地址;打开时恢复正常。

这一步的关键是替换逻辑要集中在一处——比如统一走一个资源地址解析函数,所有模板都调它。如果地址散落在几十个模板里硬编码,故障时你根本改不过来,这才是真正的风险。

3. 加上自动回退

开关是给人按的,故障是突发的。再加一层:网页上的图片加载失败时,脚本自动把地址换回源站同路径;源站如果没有对应文件,由一个兜底路由按文件名反查索引,跳到真正的本地副本。这样即使没人来得及按开关,页面也不会大面积裂图。

五、上线后怎么验证

  • 关掉开关,逐页看源码:搜索 CDN 域名,正常情况应该一条都不剩。首页、栏目页、详情页都要抽查,因为富文本正文里的图片往往走的是另一条渲染路径,很容易被漏掉。
  • 直接访问几个本地地址:确认 logo、favicon、二维码这些本地文件真的返回 200,而不是 404——有些文件"以为留了",其实没同步过去。
  • 再切回 CDN 确认能恢复:只用单向测试,很容易做出一个"能关不能开"的开关。

六、判断清单

  • 你数过首页有多少资源来自 CDN 域名吗?
  • 这些资源在源站有没有留副本?
  • 如果 CDN 现在挂掉,你的页面还剩多少能看?
  • 切换回源站要做几步?是点一个按钮,还是改代码重新部署?

CDN 是个好东西,但它应该是"加速层",不该是"单一来源"。把兜底做在前面,它才能只带来好处。