CDN 工作原理:为什么静态资源会从离你更近的节点返回
围绕CDN 章节,讲清 DNS 调度、边缘节点、缓存命中、回源、TTL、缓存策略和常见排查思路。
相关工具
CDN 解决的是距离和重复获取
资料 对 CDN 的定义很直接:CDN 是内容分发网络,它把内容存储在分布式服务器上,让用户从距离较近的服务器获取资源,减少传输时间和传输距离,从而降低延迟。
这句话里有两个重点。第一是“分布式服务器”,也就是很多地方都有 CDN 节点,用户不必每次都跑到源站所在地。第二是“内容存储”,也就是节点会缓存资源,命中缓存时可以直接返回,不必每次都回源站取。
所以 CDN 不只是多放几台服务器。它把 DNS 调度、边缘节点、缓存策略、回源链路和压缩传输放在一起,目标是让常见资源更快、更稳地到达用户。图片、CSS、JS、字体、视频切片这些静态资源,最适合先交给 CDN。
第一步不是访问源站,而是 DNS 调度
用户在浏览器里输入域名后,还是要先做 DNS 解析。不同的是,网站启用 CDN 后,DNS 解析通常不会直接返回源站服务器 IP,而是返回一个更合适的 CDN 节点 IP。文中也提到,如果网站启用了 CDN,DNS 解析会返回距离用户最近的 CDN 节点地址。
这里的“最近”不一定只看地理距离。CDN 调度还会参考运营商、网络质量、节点负载、节点可用性和配置策略。一个上海用户可能被调到华东节点,一个广州用户可能被调到华南节点,海外用户则可能被调到海外边缘节点。
浏览器拿到 CDN 节点 IP 后,请求就先到边缘节点,而不是直接打到源站。这一步很关键。很多人以为 CDN 是源站前面的一层代理,其实从用户视角看,第一跳的 HTTP 访问目标已经变成了 CDN 节点。
缓存命中就直接返回,未命中才回源
CDN 节点收到请求后,会先检查自己有没有这个资源的缓存。如果有,而且缓存没有过期,就直接把资源返回给用户。这叫缓存命中。命中时,源站完全不用参与,用户等待的主要是到边缘节点的网络时间和节点读取缓存的时间。
如果节点没有缓存,或者缓存已经过期,就会回源。回源就是 CDN 节点向源站服务器请求资源,拿到资源后再返回给用户,并按照缓存规则把资源存到节点上。后续其他用户请求同一个资源,就可能直接命中缓存。
这也是 CDN 能降低源站压力的原因。热门图片、前端静态文件、下载包、视频切片被节点缓存后,大量重复请求不再打到源站。源站只需要处理缓存未命中、缓存刷新、动态接口和真正需要实时计算的内容。

启用 CDN 后,DNS 会把用户调度到合适的边缘节点。节点命中缓存时直接返回,未命中时回源获取并写入缓存。
CDN 为什么能加速
资料 把 CDN 的加速方式列得很清楚。第一是就近访问。用户访问离自己近的节点,跨地区、跨运营商、跨国链路减少了,延迟自然下降。对于图片、脚本、样式表这种页面加载资源,几十毫秒的差距累积起来就很明显。
第二是内容缓存。CDN 节点可以缓存静态资源,命中后直接返回,省掉回源时间。第三是前置缓存,也就是把热门内容提前推到节点。比如活动页正式使用前,先把首屏图、CSS、JS 预热到节点,用户第一次访问时就不必等待节点回源。
第四是智能负载均衡。CDN 会根据节点负载和可用性把请求调度到更合适的节点,不一定死守某一个地点。第五是压缩技术,减少传输数据大小。第六是并行下载或连接复用,提高多个资源一起加载时的效率。
什么内容适合放 CDN
最适合 CDN 的是静态资源:图片、CSS、JS、字体、视频、安装包、公开下载文件。这些内容变化不频繁,而且很多用户会重复访问。文件名如果带版本号,比如 `app.8f3a1c.js`,就更适合长缓存,因为内容变了文件名也会变。
HTML 和 API 就要谨慎。HTML 可能承载页面结构、AB 实验、登录态入口或首屏动态内容;API 更可能和用户身份、权限、实时数据有关。如果没有明确缓存规则,动态内容被 CDN 缓存后,很容易出现用户看到旧数据、看到别人数据、接口更新后仍返回旧响应。
并不是 HTML 和 API 一定不能走 CDN,而是要分清能不能缓存、缓存多久、按什么维度缓存。比如公开的文章页 HTML 可以短缓存,匿名接口可以按查询参数缓存,登录后的个性化接口一般就不该被公共 CDN 缓存。

CDN 的加速来自就近访问、缓存、前置缓存、负载均衡、压缩和并行下载。缓存策略要区分静态资源、HTML、API 和用户态内容。
缓存控制靠头部和版本管理
浏览器、CDN 和源站之间要想配合好,必须有缓存控制规则。常见头部包括 `Cache-Control`、`Expires`、`ETag`、`Last-Modified`。其中 `Cache-Control` 决定资源能不能缓存、缓存多久、是否必须重新验证;`ETag` 和 `Last-Modified` 常用于协商缓存。
静态资源常用的做法是“长缓存 + 文件名版本号”。比如 JS、CSS 构建后文件名带 hash,内容一变 hash 就变。旧文件可以缓存很久,新版本通过新 URL 发布,避免用户拿到旧内容。图片也可以用类似策略,只要替换图片时 URL 能变,缓存就不会拦住更新。
不带版本号的资源要小心。比如 `/logo.png` 设置了一年缓存,后来换了 logo,很多用户和 CDN 节点可能还在用旧文件。要么改 URL,要么刷新 CDN,要么把 TTL 设短。缓存不是越长越好,它要和发布方式配套。
回源链路也会出问题
缓存命中时问题少,缓存未命中时就要看回源。CDN 回源要知道源站地址、协议、端口、Host、路径改写、证书校验和超时时间。任何一个配置不对,都可能出现节点访问正常页面失败、某些地区 502、HTTPS 证书不匹配、静态资源路径错乱。
还有一种常见问题是回源压力突然升高。比如缓存规则误改,导致大量资源不缓存;或者大促前没有预热,节点同时回源热门资源;又或者缓存集中到期,大量请求在同一时间穿透到源站。这时用户看到的是慢,源站看到的是突增流量。
解决这类问题,不能只盯着源站日志。还要看 CDN 的命中率、回源带宽、回源状态码、节点分布、缓存刷新记录和规则变更记录。CDN 在源站前面,多了一层就多了一组可观测指标。
排查时先分三类:慢、旧、错
CDN 问题可以先粗分成三类。第一类是慢。慢可能是用户没有被调度到合适节点,也可能是缓存命中率低、资源太大、没有压缩、跨运营商链路质量差。抓包和响应头能看到请求落到哪里,也能看到是否命中 CDN 缓存。
第二类是旧。用户说页面还是旧版、图片没更新、JS 行为不对,往往和 TTL、浏览器缓存、CDN 节点缓存或文件名版本有关。先看资源 URL 有没有变化,再看响应头里的缓存时间,再确认是否做过 CDN 刷新或预热。
第三类是错。比如 403、404、502、证书错误、跨域错误、资源路径错误。403 可能是防盗链或权限规则,404 可能是回源路径,502 可能是源站不可达或协议配置错误,证书错误则要看 CDN 证书和回源证书。分类以后,排查会快很多。
面试里怎么讲
如果被问 CDN 是什么,可以先说:CDN 是内容分发网络,通过在多个地区部署边缘节点,把静态内容缓存到离用户更近的节点,让用户就近访问,减少传输距离和源站压力。
如果被问 CDN 工作流程,可以按 相关的顺序讲:用户访问域名,DNS 解析返回合适的 CDN 节点 IP;用户请求到达该节点;节点检查是否有缓存,命中就直接返回,未命中就回源获取资源,并把资源缓存到节点,供后续请求使用。
如果被问 CDN 为什么能加速,可以回答:就近访问降低网络延迟,内容缓存减少回源,前置缓存让热门资源提前到节点,负载均衡选择更合适的节点,压缩减少传输体积,并行下载和连接复用提高资源加载效率。再补一句缓存风险:动态内容和用户态内容要谨慎缓存,否则容易出现旧数据或数据泄露。
常见问题
CDN 一定会直接访问源站吗?
不会。CDN 节点命中缓存时会直接返回资源;只有缓存未命中、缓存过期或规则要求重新验证时,才会回源获取内容。
为什么静态资源适合 CDN?
静态资源变化少、重复访问多,适合缓存在边缘节点。图片、CSS、JS、字体、视频切片等资源命中缓存后,可以减少回源并降低用户等待时间。
CDN 缓存导致用户看到旧内容怎么办?
优先检查资源 URL 是否带版本号、响应头里的缓存时间是否过长、CDN 是否需要刷新或预热。长期方案是静态资源使用版本号文件名,避免同一个 URL 指向不同内容。