CDN 缓存策略配置实战:从缓存规则到 curl 验证缓存命中与回源

举报
yd_288136036 发表于 2026/11/07 09:14:43 2026/11/07
【摘要】 CDN 把源站内容缓存到离用户最近的边缘节点:用户请求先到边缘节点,命中缓存直接返回,不用回源;未命中或缓存过期时,节点回源拉取最新内容,再返回给用户并按规则写入缓存。缓存策略配得好,源站压力和首字节耗时都会明显下降;配得不好,要么回源率居高不下,要么用户拿到过期内容。本文结合华为云 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 控制台配置的步骤

  1. 进入 CDN 控制台,选择域名,进入“缓存配置”。
  2. 新建缓存规则:缓存类型选“文件后缀”,填写 js、css、png、jpg、woff2,缓存时间 30 天。
  3. 再建一条目录规则:目录 /api/,缓存时间 0 秒(不缓存)。
  4. 对首页 index.html 单独建一条精确规则:缓存时间 0 秒或 300 秒,确保发布新版本后用户很快拿到新页面。
  5. 开启“缓存键规则”,对静态资源忽略无关查询参数;开启“Range 回源”,支持大文件分片回源。
  6. 配置完成后先用测试 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 控制台的缓存命中率曲线。

五、落地检查清单

  1. 静态资源 TTL 30 天,文件名带版本哈希;
  2. 首页 HTML 短缓存,发布后刷新;
  3. API 目录不缓存;
  4. curl 两次请求验证 HIT;
  5. 定期看命中率曲线,低于 80% 就复查规则。

缓存策略没有放之四海而皆准的数值,核心是“静态长缓存、动态不缓存、入口短缓存”,再用 curl 的 X-Cache 把每一次配置都验证一遍。把验证命令写进发布检查清单,缓存问题就不再是玄学。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。