CDN 缓存策略配置实战:从缓存规则到 curl 验证缓存命中与回源
CDN 把源站内容缓存到离用户最近的边缘节点:用户请求先到边缘节点,命中缓存直接返回,不用回源;未命中或缓存过期时,节点回源拉取最新内容,再返回给用户并按规则写入缓存。缓存策略配得好,源站压力和首字节耗时都会明显下降;配得不好,要么回源率居高不下,要么用户拿到过期内容。本文结合华为云 CDN,给出一套可直接落地的缓存策略配置方法,并用 curl 把每一步验证清楚。
一、缓存策略的三个核心要素
1. 缓存键:什么算“同一个资源”
默认缓存键是完整 URL(含查询参数)。带版本号的静态资源如 app.v20261107.js,改版后 URL 变化,天然实现“更新即失效”;而对 ?page=1、?page=2 这类分页参数,忽略参数会导致不同页共用一份缓存。华为云 CDN 支持按“忽略 URL 参数”或“保留指定参数”配置缓存键,动态接口建议保留全部参数或直接不缓存。
2. 缓存时间(TTL):缓存多长时间
TTL 决定边缘节点在多久内直接用缓存响应。静态资源可以配长,HTML 入口文件配短,接口不缓存。常见配置参考:图片、字体、JS、CSS 缓存 30 天;HTML 入口文件缓存 0 秒或 5 分钟(配合带版本号的文件名);API 接口(/api/*)不缓存。源站返回的 Cache-Control: max-age 也会影响缓存,控制台规则优先级更高,配置时以控制台为准,避免两边打架。
3. 缓存范围:哪些内容走缓存
按文件后缀或目录配置规则,遵循“先精确、后宽泛”的顺序:例如先给 /api/* 配置“不缓存”,再给 .jpg、.png、.js、.css 配置 30 天缓存,最后给其余内容一个默认的短缓存。规则从上到下匹配,宽泛规则放后面,避免把动态接口误判成静态资源。
二、在华为云 CDN 控制台配置的步骤
- 进入 CDN 控制台,选择域名,进入“缓存配置”。
- 新建缓存规则:缓存类型选“文件后缀”,填写 js、css、png、jpg、woff2,缓存时间 30 天。
- 再建一条目录规则:目录 /api/,缓存时间 0 秒(不缓存)。
- 对首页 index.html 单独建一条精确规则:缓存时间 0 秒或 300 秒,确保发布新版本后用户很快拿到新页面。
- 开启“缓存键规则”,对静态资源忽略无关查询参数;开启“Range 回源”,支持大文件分片回源。
- 配置完成后先用测试 URL 验证,再全量生效;修改规则后用“缓存刷新”功能让旧缓存立即失效,而不是等 TTL 自然过期。
三、用 curl 验证缓存命中与回源
判断是否命中的关键是响应头。华为云 CDN 会在响应头里返回 X-Cache:HIT 表示命中缓存、未回源,MISS 表示未命中、已回源。X-Cache-Lookup 表示是否查过缓存,Age 表示该资源已在缓存中存放的秒数。
# 第一次请求:大概率 MISS,节点回源拉取
curl -sI https://www.example.com/static/app.js | grep -i -E 'x-cache|age|cache-control'
# 紧接着第二次请求:应变为 HIT,且 Age 递增
curl -sI https://www.example.com/static/app.js | grep -i -E 'x-cache|age|cache-control'
# 只看缓存状态,一行命令
curl -sI https://www.example.com/static/app.js | grep -i x-cache
# 强制回源验证源站内容:加 no-cache 请求头,节点忽略缓存直接回源
curl -I -H "Cache-Control: no-cache" https://www.example.com/static/app.js
# 对比命中与回源的耗时差异:time_starttransfer 是首字节耗时
curl -s -o /dev/null -w "HTTP %{http_code} 首字节 %{time_starttransfer}s 总耗时 %{time_total}s\n" https://www.example.com/static/app.js
把上面命令里的域名换成自己的加速域名。连续请求两次对比是最直观的办法:第一次 MISS、第二次 HIT,说明缓存策略生效;如果两次都是 MISS,先检查缓存规则是否匹配该 URL,再检查源站是否返回了 no-store、private 或 Set-Cookie 这类禁止缓存的响应头。
四、常见问题与排查
- 一直 MISS:规则未匹配(检查后缀、目录大小写)、源站响应头含 Cache-Control: no-cache 或 no-store、资源带随机查询参数导致缓存键每次都不同。
- 更新后用户还看到旧页面:HTML 被缓存了,把入口文件 TTL 改短,或发布后做一次 URL 刷新。
- 动态接口被缓存:给 /api/ 配“不缓存”规则,并确认源站接口返回 Cache-Control: no-store。
- 命中率忽高忽低:节点是分布式的,不同节点缓存状态不同,用同一节点或多次请求观察,也可以看 CDN 控制台的缓存命中率曲线。
五、落地检查清单
- 静态资源 TTL 30 天,文件名带版本哈希;
- 首页 HTML 短缓存,发布后刷新;
- API 目录不缓存;
- curl 两次请求验证 HIT;
- 定期看命中率曲线,低于 80% 就复查规则。
缓存策略没有放之四海而皆准的数值,核心是“静态长缓存、动态不缓存、入口短缓存”,再用 curl 的 X-Cache 把每一次配置都验证一遍。把验证命令写进发布检查清单,缓存问题就不再是玄学。
- 点赞
- 收藏
- 关注作者
评论(0)