什么是 CDN?内容分发网络通俗讲解
CDN(内容分发网络)是一个分布在许多城市的服务器网络,它们保存着你网站文件的副本,包括图片、脚本、样式表,有时还包括整个页面。当有人访问你的网站时,会从离他们较近的地点获取内容,而不是从远处的某台服务器获取。这样页面加载更快,减轻了你自己服务器的负担,也让网站更能应对访问量的突然激增。
用 AI 做网站时,为什么 CDN 很重要
你可能从来没有亲自设置过 CDN,因为许多托管平台会自动在你的网站前面放置一个。但你会感受到它的影响:
- 速度。 页面加载更快,访客会停留得更久,而且这也是搜索引擎会考虑的因素之一。参见如何让你的网站更快。
- “为什么我的修改没有显示出来?” 发布更新之后,旧版本的缓存副本可能会在一段时间内仍然存在。了解原因可以省去很多困惑。
- 隐私与正确性。 如果 CDN 缓存了错误的内容,比如包含某个用户个人信息的页面,下一位访客就可能看到它。了解哪些内容应该缓存、哪些不应该,有助于你问对问题。
日常类比
想象一家面包店只在一家门店里卖面包,而却要全国供应。每位顾客,无论住得多远,都得等待从这一家店配送过去,而在繁忙的日子里,排队的人会非常多。
CDN 就像在全国各地的便利店里都摆上同样的面包。顾客可以就近、快速地买到,而总店只需要偶尔给便利店补货。但也有个问题:当面包店改了配方,便利店仍会继续卖旧的面包,直到他们被告知要换掉,或者旧库存过期为止。
CDN 的工作原理
- 源站。 你的网站存放在主服务器或托管平台上,这被称为源站(origin)。
- 边缘节点。 CDN 在许多地方运行服务器,称为边缘节点(edge location)或接入点(PoP,point of presence)。
- 路由。 当访客请求你的网站时,DNS 或网络路由会把他们导向附近的边缘节点。参见域名和 DNS 如何工作。
- 缓存命中。 如果该边缘节点已经有一份新鲜的文件副本,就会立即发送给访客。
- 缓存未命中。 如果没有,边缘节点会从源站获取文件,发送给访客,并保存一份副本供下一位访客使用。
- 过期。 每份副本保存的时间由你的服务器发送的缓存标头(cache headers)控制,或者直到它被清除为止。
实际例子:一个带照片的作品集网站
一位摄影师的作品集网站有首页、一个包含 60 张大图的画廊,以及一个联系表单。源站位于欧洲。一位新加坡的访客打开了画廊。
- 没有 CDN: 每张图片都要从欧洲传过来。每次请求都要跨越半个地球往返,因此画廊会慢慢加载出来。
- 有 CDN: 新加坡附近的第一位访客会让那里的边缘节点获取并保存这些图片。之后该地区的每位访客都能从附近快速获取。
现在,摄影师替换了首页的主图并重新发布。以下内容决定了访客是否能看到更新:
/index.html → 缓存时间短,频繁检查
/assets/index-3f9a2c.js → 缓存时间长
/assets/hero-8b41d0.jpg → 缓存时间长
包括 Vite 在内的现代构建工具,会为文件赋予哈希文件名,比如 hero-8b41d0.jpg。文件内容改变时,文件名也会随之改变,因此页面请求的是一个所有缓存都没见过的全新文件。HTML 页面本身只缓存很短的时间,因此它很快就会指向新文件。这就是同时获得长期缓存和及时更新的标准做法。
联系表单则不同。它的提交每次都要发送到服务器,因此绝不应该被缓存。
哪些内容该缓存,哪些不该
| 通常长期缓存 | 通常短期缓存 | 共享 CDN 中不应缓存 |
|---|---|---|
| 图片、字体、视频 | 公开网站的 HTML 页面 | 登录后的页面、仪表板 |
| 带哈希文件名的 JavaScript 和 CSS | 偶尔变化的公开 API 数据 | 任何包含个人数据的内容 |
| 很少变化的可下载文件 | 表单提交、支付,以及任何 POST 请求 |
关键术语
| 术语 | 含义 |
|---|---|
| 源站(Origin) | 你的主服务器或主机,真正的文件存放在这里。 |
| 边缘节点 / PoP | 为附近访客提供服务的 CDN 节点。 |
| 缓存命中 / 未命中 | 边缘节点已有该文件 / 需要从源站获取该文件。 |
| TTL | 生存时间(Time to live),即缓存副本被保留的时长。 |
| Cache-Control 标头 | 你的服务器发送的指令,说明某内容是否可以缓存以及缓存多久。 |
| 清除 / 失效(Purge / invalidate) | 通知 CDN 立即丢弃缓存副本。 |
| 缓存破坏(Cache busting) | 内容变化时更改文件的名称或 URL,使缓存去获取新版本。 |
| 延迟(Latency) | 由距离和网络跳数造成的延迟。 |
关于更广义的缓存(浏览器、服务器和数据库中的缓存),参见什么是缓存。
常见误解
- “CDN 能让一切都变快。” 它只能加快文件的传输。服务器上缓慢的数据库查询或缓慢的 AI 调用依然很慢。
- “CDN 可以取代托管。” 它位于你的托管之前。你仍然需要一个源站。
- “我更新了网站,所有人就会立即看到。” 旧副本可能会在 CDN 和浏览器中残留一段时间。可以通过强制刷新来检查,并使用哈希文件名。
- “缓存总是安全的。” 在共享缓存中缓存个性化页面存在真实的隐私风险。私有响应应当被标记为不可缓存。
- “CDN 只适用于大公司。” 许多主机即使对小网站也会免费提供 CDN,无需额外操作。
向你的 AI 生成工具提出的要求
- “这个网站前面有 CDN 吗?它缓存了哪些文件,缓存多久?”
- “确保构建后的 JavaScript、CSS 和图片使用哈希文件名并设置较长的缓存时间,而 HTML 设置较短的缓存时间。”
- “绝不要在共享缓存中缓存登录后的页面,或包含个人数据的 API 响应。”
- “压缩并调整图片尺寸,让画廊加载得更快。”
- “我已经发布了更新,但仍然看到旧版本,这是浏览器缓存的问题还是 CDN 的问题?”
CDN 与 Mythex
在 Mythex 上发布时,静态前端会被部署为静态站点,而文档中说明,CDN 缓存在更新后可能会有短暂的延迟:如果你重新发布后仍然看到旧版本,请对公开 URL 进行强制刷新。这一点无需任何配置。如果你连接的自定义域名,其 DNS 托管在 Cloudflare 上,文档会要求你将该记录设置为“仅 DNS”而非代理(proxied),这样 Mythex 才能正确签发 HTTPS 证书。参见文档中的如何发布和自定义域名,以及我们的网站托管指南。
常见问题
简单来说,什么是 CDN?
CDN(内容分发网络)是由分布在许多地点的服务器组成的网络,它们保存着你网站文件的副本。访客会从离他们较近的节点获取内容,而不是从你的主服务器获取,因此页面加载更快,你的服务器也承担更少的工作。
我更新网站后,为什么还能看到旧版本?
通常是因为旧文件的副本被缓存了,可能在 CDN 中,也可能在浏览器中,或者两者都有。强制刷新可以解决浏览器这一侧的问题;CDN 中的副本会自行过期,或者可以被清除。构建工具会通过为改动过的文件赋予新名称,来避免大部分这类问题。
小型网站需要 CDN 吗?
很多时候你不用选择,就已经拥有 CDN 了,因为许多托管平台会自动在网站前面放置一个 CDN。如果你的平台没有,而且访客分布在不同国家,那么添加一个通常是值得的。
CDN 能缓存我应用的数据和登录后的页面吗?
CDN 可以缓存任何被允许缓存的内容,所以必须谨慎地进行设置。图片、脚本和样式表等公共文件非常适合缓存。个人或登录后的内容通常不应该缓存在共享 CDN 中,否则一个用户可能会看到另一个用户的数据。