CDN 加速配置实战:静态资源分发与缓存刷新策略

6 ℃ 0 条
内容摘要CDN 通过边缘节点缓存静态资源,能降低源站带宽与首屏耗时。本文按接入顺序讲解回源 HOST 与回源协议配置、按文件类型分级设置缓存时间、以及发版后刷新 URL 与预热的正确操作,并给出 Nginx 缓存头与刷新接口示例,帮你避开缓存不生效与回源风暴等常见问题。
CDN 加速配置实战:静态资源分发与缓存刷新策略

CDN 的核心价值是把静态资源缓存到离用户最近的边缘节点,让浏览器不必每次都回源站取文件。它能同时降低源站带宽和首屏加载时间,但如果回源、缓存、刷新三段配置对不上,就会出现缓存不生效、回源流量暴涨、发版后用户仍看到旧文件等问题。下面按接入顺序把这三段讲清楚。

一、回源配置:让 CDN 正确取到源站内容

1. 源站地址与回源 HOST

回源地址填源站 IP 或源站域名。若源站是多台服务器,可配置多个回源节点,CDN 会按权重轮询,单台故障时自动切换。回源 HOST 决定 CDN 以哪个域名的身份去请求源站,如果源站用 Nginx 按 server_name 区分站点,回源 HOST 必须与源站配置的域名一致,否则会命中默认站点,返回 404 或错误页面。

2. 回源协议与端口

源站已上 HTTPS 时,回源协议选 HTTPS,避免明文传输和证书告警;若源站只在 80 端口监听,回源协议保持 HTTP。回源超时建议设置在 10 秒以内,配合源站自身 5 秒的响应上限,避免慢请求长时间占用连接。

源站侧通常需要显式声明缓存头,让 CDN 知道哪些资源可以长期缓存:

location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, max-age=2592000, immutable";
    access_log off;
}

immutable 告诉浏览器在 max-age 内不要发校验请求,静态资源可显著减少 304 往返。

二、缓存策略:分级设置过期时间

1. 按文件类型分级

不同资源的更新频率差异很大,一刀切设置缓存时间不是最优。常见分层:图片、字体、视频等几乎不变的内容设 30 天;CSS、JS 等构建产物设 7 到 30 天并配版本号;HTML 入口文件设 0 到 300 秒,保证发版后能快速切换。

2. 缓存键与忽略参数

CDN 默认以完整 URL 作为缓存键,带 ?v=1 和 ?v=2 会被视为两个资源,各自回源一次。若参数只用于版本控制且不影响内容,可在控制台开启「忽略参数缓存」,让同一路径只缓存一份。反过来,接口类动态内容应按 Query String 区分,避免把不同用户的数据缓存成同一份返回给所有人。

三、缓存刷新与预热:发版后的正确操作

1. 刷新 URL 与目录

修改了文件名以外的内容(如直接覆盖 style.css),必须刷新对应 URL,否则边缘节点仍返回旧文件。刷新分 URL 刷新和目录刷新,前者精确命中、生效快;后者范围大、生效慢,且会清空整个目录的缓存,容易引发回源风暴。刷新一般 5 分钟内全网生效。

# 提交刷新任务:URL 刷新最精确,优先用它
curl -X POST "https://cdn.example.com/api/refresh" \
  -H "Authorization: Bearer $CDN_TOKEN" \
  -d '{"type":"url","urls":["https://www.example.com/static/app.css"]}'

2. 预热与版本号

大促或新版本上线前,用预热接口提前把热门资源拉到边缘节点,用户首次访问直接命中缓存,避免回源集中。更省事的做法是构建时给文件名加 hash(如 app.3f2a1c.js),每次发版生成新文件名,天然绕过旧缓存,配合长 max-age 也不用刷新。

关键配置提示

  • 回源 HOST 必须与源站 server_name 一致,否则命中默认站点返回 404。
  • 静态资源用文件名 hash + 长 max-age,发版无需刷新即可生效。
  • 目录刷新范围大易引发回源风暴,能用 URL 刷新就不用目录刷新。

发表评论 (已有0条评论)

快来评论,快来抢沙发吧~