CDN 加速的核心原理可以概括成一句话:把静态资源提前缓存到离用户最近的边缘节点,再用 DNS 智能调度把每个用户的请求解析到延迟最低的节点,让绝大多数请求在几十毫秒内就地响应,只有缓存未命中的请求才会沿长链路回源站。理解了“就近接入 + 边缘缓存 + 回源”这三件事,CDN 的绝大部分现象都能解释清楚。
CDN 是怎么把用户请求引到最近节点的
结论:CDN 的“就近”靠的是 DNS 调度,并非节点自动挑选。
接入时你把域名 CNAME 到服务商给的调度域名(形如 xxx.cdn.example.com),用户本地 DNS(LDNS)发起解析,CDN 的权威 DNS 根据 LDNS 出口 IP 的归属地和运营商线路、节点当前负载、健康检查结果,返回一台边缘节点的 A 记录。开启 EDNS Client Subnet 后,权威 DNS 能拿到用户的真实网段而不是递归服务器的地址,就近精度会明显提升。
另一套方案是 Anycast:同一 IP 在全球多个机房同时通过 BGP 宣告,路由协议天然把包收敛到跳数最少的节点,常用于 DNS 服务和防护型 CDN。区别是 DNS 调度能做到秒级切节点、按运营商细分,Anycast 切换更快但不可按线路精细控制。
缓存命中率为什么决定加速效果
结论:CDN 的加速收益基本等于缓存命中率,命中率 90% 意味着每 10 次请求只有 1 次要回源,命中 99% 则回源量降到原来的十分之一。
缓存由响应头控制:Cache-Control: public, max-age=31536000, immutable 适合文件名带内容哈希的 JS/CSS,缓存一年不失效;HTML 入口文件用 max-age=0 或 60 秒,保证发版能及时生效;图片、字体给 7~30 天。不要只靠 CDN 控制台的 TTL 配置,源站响应头优先级更高。
缓存 key 是最容易出事的地方:默认 key 含完整 URL 和 Host,如果页面带 ?utm_source=xxx&t=1690000000 这类随机参数,每条 URL 都会被当成新资源,命中率会直接归零。做法是在控制台配置忽略 utm_*、spm、from 等无关参数,并对带 Cookie 的请求设置“不缓存”或按 Cookie 值区分。
动态内容能不能用 CDN 加速
结论:能,但原理不是缓存,而是链路优化。
API、登录态页面这类每次内容不同的请求,CDN 只做转发。边缘节点与源站之间走优质骨干或专线,用户在边缘完成 TCP 三次握手和 TLS 握手,边缘到源站复用长连接,高丢包链路上的重传在私有协议里就近处理,因此跨运营商、跨境访问的收益最明显。实测场景中,跨境 API 首字节时间(TTFB)从 800ms 降到 200ms 以内是常见结果。
CDN 配好了却不生效,通常出在哪
结论:八成是缓存 key、回源 HOST 或证书三处配错。
按这个顺序排查:
- 用
curl -sI https://你的域名/a.js 看响应头里 x-cache、age、via 字段,判断是 HIT 还是 MISS;连查两次,第二次仍 MISS 说明缓存没生效。
- 回源 HOST 配错会导致源站返回 404 或跳到默认站点,本地用
curl -H "Host: www.example.com" http://源站IP/ 可以复现。
- 新上传的证书没有同步到全部边缘节点,部分省份会报证书错误。
- 只刷新了 URL 没刷新目录,旧文件靠长 TTL 继续返回。发版前先对新资源做预热,避免第一批用户全部回源。
怎么验证 CDN 是否真的起作用
结论:看三个数——命中率、回源率、5xx 比例,前两个加起来应接近 100%。
控制台里命中率长期低于 80% 就要查缓存规则;回源率异常升高通常是缓存被频繁刷新或 TTL 过短。再用 dig +short @223.5.5.5 你的域名 和 dig +short @114.114.114.114 你的域名 分别解析,返回的节点 IP 不同才说明分线路调度在正常工作。
在 GJ 站长论坛的「SSL/CDN/网站防护」版块提问时,把 curl -I 的完整响应头、命中率截图和解析结果一起贴出来,基本能省掉三轮来回确认。相关账号规则可查等级规则页 https://www.gj0.com/levels.html。
总结:CDN 加速 = DNS 调度把请求送到最近边缘节点 + 边缘缓存承担绝大部分请求 + 未命中时才回源,动态内容额外靠链路与握手优化。把缓存 key 管好、TTL 设对、回源 HOST 和证书配对,命中率做到 95% 以上,加速效果才算真正拿到手。