Skip to content

如何用 CDN 提升网站加载速度

要点速览

  • CDN 通过“边缘节点就近分发”解决跨国访问延迟,并为原站“分流减压”。
  • 动静分离:静态资源(JS/CSS/图片)全部上 CDN;动态页面与 API 由原站处理。
  • 版本化资源 + 长缓存:构建产物加哈希,配合 Cache-Control: max-age=31536000, immutable
  • 页面配合:preconnect 到 CDN 域、合理使用 defer/async、字体资源需 crossorigin
  • 验证路径:DevTools Network 查看命中率/回源;关注核心指标(首字节、LCP)。

快速上手

用最小改动将静态资源迁移到 CDN 并配合页面与缓存策略:

html
<!-- 页面:为 CDN 域建立早期连接,提升首包速度 -->
<link rel="preconnect" href="https://cdn.example.com" crossorigin />

<!-- 引用静态资源使用 CDN 域,构建时带哈希确保更新可控 -->
<link rel="stylesheet" href="https://cdn.example.com/css/app.abc123.css" />
<script src="https://cdn.example.com/js/app.abc123.js" defer></script>

<!-- 字体等跨域资源需声明 crossorigin 以避免缓存/渲染问题 -->
<link
  rel="preload"
  href="https://cdn.example.com/fonts/inter.woff2"
  as="font"
  type="font/woff2"
  crossorigin
/>
nginx
# 原站/或 CDN 边缘节点的缓存响应头示例(亦可在 CDN 控制台配置)
location /assets/ {                     # 仅静态资源走此策略
  add_header Cache-Control "max-age=31536000, public, immutable";
  add_header Vary "Accept-Encoding";   # 避免压缩差异导致缓存命中失败
}
text
DNS 配置:将静态资源域名(如 cdn.example.com)CNAME 到 CDN 提供商加速域名;
构建配置:输出文件名包含内容哈希(如 app.[contenthash].js),方便长缓存与安全回滚。

正确心智模型

  • CDN 不是“换机房”:它是将内容复制到全球边缘节点,用户就近获取以降低 RTT。
  • 关键在“动静分离 + 长缓存 + 版本化”:用哈希文件名保证资源更新与缓存可控。
  • 页面仍需配合连接与加载策略(如 preconnectdefer),整体才能发挥效果。

核心问题引入(面试场景)

面试官典型提问:
“网站部署在上海,美国用户访问特别慢,该如何优化?”
视频指出:这类“跨国网络延迟”场景题有固定解法,核心思路可总结为“先定位根源,再针对性优化”。

第一步:定位跨国访问慢的根源

需先明确问题核心,排除干扰项,可能的原因有 3 类:

  1. 物理距离太远(跨国访问的根本矛盾);
  2. 原站服务器负载高(CPU、网络出口压力大);
  3. 静态资源加载拖慢整体速度(图片、CSS、JS 等资源未优化)。

第二步:针对性优化方案(核心:CDN 应用)

针对上述根源,需分层解决,核心手段为引入 CDN(内容分发网络) ,具体策略如下:

1. 解决“物理距离远”:CDN 的“空间换时间”

  • 痛点:即使将上海服务器带宽加至无限大,美国用户访问仍慢——因光纤传输有物理极限,距离决定延迟下限;
  • 方案:引入 CDN,将网站内容(静态资源、部分动态内容)缓存到全球各地的“边缘节点”,让用户“就近获取”内容;
  • 本质:用“空间资源(多节点部署)”换“时间资源(降低访问延迟)”,适用于所有全球化业务。

2. 解决“原站负载高”:CDN 分流+原站减负

  • 重点关注:原站的 CPU 占用率、网络出口带宽;
  • 策略:
    • 大部分请求由 CDN 边缘节点承担(直接返回缓存内容);
    • 原站仅处理 2 类请求:① 未被 CDN 缓存的动态请求(如用户个性化数据);② CDN 节点向原站“回源”更新缓存的请求;
  • 效果:极大降低原站压力,提升整体架构稳定性。

3. 解决“静态资源加载慢”:强制 CDN+动静分离

  • 避坑提醒:若让原站处理所有资源(动态+静态),属于“原始且浪费资源”的做法;
  • 正确方案:动静分离——将静态资源全部交给 CDN:
    • 归 CDN 管的资源:图片、CSS 样式表、JS 脚本;
    • 归原站管的资源:动态页面(如用户订单页)、数据库交互请求;
  • 优势:用户从就近 CDN 节点获取静态资源,加载速度显著提升。

额外优化:CDN 缓存策略调优

  • 核心目标:提高 CDN 缓存命中率(减少“回源”次数);
  • 具体操作:根据业务需求调整缓存时间(如:高频更新的资源设短缓存,静态不变的资源设长缓存);
  • 最终方案:整合上述所有策略,形成“CDN 全站加速方案”。

面试答题高分策略(总结)

面对此类性能优化题,遵循“三步法”,让面试官认可:

  1. 先分析:明确问题可能的根源(如跨国访问慢的 3 类原因);
  2. 再分类:按根源类型拆分,避免笼统回答;
  3. 后给方案:针对每类根源给出具体解法(如 CDN 分流、动静分离)。

关键知识点提炼

常见误区与避坑

  • 静态资源未版本化:未加哈希导致缓存更新不可控,容易出现“用户拿到旧资源”。
  • 缓存键污染:将 Cookie 或不必要的 Query 计入缓存键,命中率骤降、频繁回源。
  • 压缩与编码未区分:缺失 Vary: Accept-Encoding 导致 gzip/br 混用引发缓存错配。
  • 未启用 HTTP/2/3 与 Brotli:小文件/多请求场景收益显著,需在 CDN/原站开启。
  • 字体跨域异常:未加 crossorigin 导致字体缓存与渲染问题(尤其在 Safari 等浏览器)。

小结与后续

  • 跨国慢的“根因”是物理距离与原站压力;CDN 通过就近分发与分流减压显著提速。

  • 采用动静分离、版本化资源与长缓存策略,并在页面侧配合 preconnect/defer/字体跨域。

  • 用 DevTools/Lighthouse 验证缓存命中与核心指标(如 TTFB、LCP),持续调优缓存时间与策略。

  • 核心技术:CDN(内容分发网络);

  • 核心思想:空间换时间、动静分离、负载分流;

  • 高频考点:跨国访问优化、CDN 应用场景、缓存命中率调优。