发版后用户还在看旧页面?华为云CDN缓存规则、刷新预热与五个常见坑

举报
yd_235631729 发表于 2026/10/28 13:17:47 2026/10/28
【摘要】 后端没减压、发版后用户还看旧页面?本文梳理华为云CDN缓存原理、缓存规则与优先级配置、刷新预热的正确顺序,用curl验证缓存命中,并剖析Cache-Control优先级、回源过多、HTTPS证书等常见坑,附排障清单。

接入华为云内容分发网络(CDN)后,很多团队都遇到过类似的困惑:配置了缓存规则,命中率却一直上不去,源站压力几乎没减;前端发版后,部分用户看到的还是旧页面;切换 HTTPS 后浏览器突然报证书错误。这些问题大多不是 CDN 本身“出了故障”,而是对缓存机制、规则优先级和刷新预热的理解有偏差。本文从原理讲起,结合配置示例、curl 验证命令和排障清单,把 CDN 缓存这件事一次讲清楚。

一、CDN 缓存是怎么工作的

用户请求加速域名时,DNS 会通过 CNAME 把请求调度到就近的 CDN 节点:

  • 命中(HIT):节点上有该资源且未过期,直接返回,不访问源站;
  • 未命中(MISS):节点没有缓存或缓存已过期,节点回源拉取,再按缓存规则决定是否保存、保存多久。

决定“存不存、存多久”的核心是缓存过期时间;决定“哪些请求算同一份内容”的是缓存键(Cache Key),通常由 URL 路径加上参数构成。理解这两点,后面绝大多数坑都能找到原因。

还要注意,CDN 是多级节点结构(边缘节点、中间层节点),某个节点命中不代表所有节点都命中,因此同一个 URL 在不同地区的首次访问仍可能回源。

二、缓存规则怎么配

华为云 CDN 允许按不同维度为资源设置缓存过期时间,常见的匹配类型包括:所有文件、文件后缀、目录、全路径、首页等。每条规则可以设置优先级和过期时间,并可选择是否遵循源站的缓存策略。具体选项名称与取值范围请以控制台和官方文档为准,下面给出一份典型配置思路:

匹配类型 匹配内容 缓存过期时间 优先级 说明
文件后缀 .php;.jsp;.aspx 0(不缓存) 高 动态内容直接回源
目录 /api 0(不缓存) 高 接口数据实时性要求高
文件后缀 .jpg;.png;.webp;.woff2 30 天 中 图片、字体基本不变
文件后缀 .js;.css 7 天 中 配合文件名带哈希版本号
全路径 /index.html 5 分钟 高 入口页需尽快生效新版本
所有文件 / 或 * 1 天 低 兜底规则

几个配置原则:

  1. 动静分离:动态接口、带用户身份的页面不要缓存,否则可能把 A 用户的数据返回给 B 用户;
  2. 越具体的规则优先级越高:全路径、目录规则应高于后缀规则,“所有文件”兜底规则放在最低;
  3. 静态资源长缓存 + 文件名版本化:例如 app.3f9a1c.js,内容变了文件名就变,天然不存在旧缓存问题;
  4. 入口文件短缓存:index.html 这类引用其他资源的入口页,缓存时间要短,或者每次发版后主动刷新。

此外建议关注URL 参数处理。如果页面链接中带有 ?utm_source=xxx、?t=时间戳 之类与内容无关的参数,而缓存键包含全部参数,那么每个不同的参数都会被当作新资源,导致命中率极低。可以根据业务设置忽略参数或只保留影响内容的参数。反过来,如果参数决定了返回内容(如图片处理参数 ?w=200),就不能忽略它。

三、刷新与预热

刷新是让 CDN 节点上的缓存失效,下次请求时重新回源获取最新内容。一般支持两种方式:

  • URL 刷新:精确刷新单个文件,适合少量文件更新;
  • 目录刷新:刷新整个目录下的资源,适合批量发版。

预热则相反:主动让 CDN 节点提前回源拉取资源并缓存,适合大版本发布、活动上线、大文件(安装包、视频)分发等场景,避免流量洪峰集中回源把源站打垮。

使用时需注意:

  • 刷新和预热都有每日配额和单次提交数量限制,以控制台显示为准;
  • 任务提交后需要一定时间在全网节点生效,不是瞬间完成,可以在任务记录中查看进度;
  • 先刷新、再预热:如果文件已有旧缓存,直接预热可能不会覆盖,正确顺序是先刷新旧缓存,再预热新内容;
  • 提交的 URL 要与用户实际访问的完全一致,包括协议、域名、路径大小写;
  • 预热会产生回源流量,大批量预热最好避开源站业务高峰。

四、用 curl 验证是否命中缓存

配置完成后,不要只看控制台统计,应直接用命令行检查响应头。

# 只看响应头,-I 发送 HEAD 请求
curl -I https://cdn.example.com/static/logo.png

# 用 GET 请求并丢弃响应体,只打印响应头(部分源站对 HEAD 处理不一致)
curl -s -o /dev/null -D - https://cdn.example.com/static/logo.png

重点关注以下几个字段:

  • Age:资源在缓存中已存在的秒数。连续请求几次,如果 Age 存在且不断增大,基本说明命中了缓存;
  • Cache-Control / Expires:源站下发的缓存策略,判断是否被 no-cache、private 等指令影响;
  • Last-Modified / ETag:用于判断拿到的是否是新版本内容;
  • 厂商自定义头:CDN 通常会在响应中附带标识命中状态或节点信息的自定义头部,具体名称以实际响应为准,可对比两次请求的差异来确认含义。

对比 CDN 与源站返回的内容是否一致,可以绕过 DNS 直接访问源站:

# 直接请求源站,并带上加速域名的 Host
curl -s -o /dev/null -D - -H "Host: cdn.example.com" http://<源站IP>/index.html

# 对比文件指纹
curl -s https://cdn.example.com/index.html | md5sum
curl -s -H "Host: cdn.example.com" http://<源站IP>/index.html | md5sum

# 查看耗时,命中缓存时首包时间通常明显更短
curl -s -o /dev/null -w "dns:%{time_namelookup} connect:%{time_connect} ttfb:%{time_starttransfer} total:%{time_total}\n" https://cdn.example.com/static/logo.png

还可以用 dig cdn.example.com CNAME 确认域名是否已正确解析到 CDN 分配的 CNAME 地址,没切过去的话所有请求其实都在直连源站。

五、五个常见坑

坑一:Cache-Control 与 CDN 规则谁说了算? 这是最容易混淆的一点。如果在缓存规则中开启了遵循源站缓存策略,CDN 会优先采用源站响应中的 Cache-Control、Expires 等头部;源站没有返回这些头时,才使用控制台配置的过期时间。如果没有开启,则以 CDN 规则为准。因此常见现象是:控制台明明设了 30 天,但源站返回了 Cache-Control: no-cache 或 max-age=0,结果每次都回源。排查时先 curl -I 源站,看清它到底返回了什么。另外,源站返回 private、带 Set-Cookie 的响应,在很多场景下也会影响缓存行为,具体规则以官方文档为准。

坑二:缓存不生效、回源过多。 除了上面的源站头部问题,常见原因还有:URL 带了随机参数导致缓存键各不相同;规则优先级配置错误,兜底的“不缓存”规则压过了静态资源规则;源站返回非 200 状态码(如 302、404)且这些状态码未配置缓存;资源访问量低、在节点上被淘汰。建议结合控制台的命中率与回源统计,按 URL 维度找出回源最多的资源逐个分析。

坑三:更新后用户还看到旧内容。 根因是旧资源仍在缓存有效期内。治本的办法是静态资源文件名带内容哈希,入口页面短缓存;发版流程中加入“刷新入口页面和变更目录”这一步。同时要意识到,浏览器本地缓存也可能存在:CDN 刷新只能清除节点缓存,清不掉用户浏览器里的副本,所以源站下发给浏览器的 Cache-Control 也要合理设置。

坑四:HTTPS 证书相关问题。 典型表现有:上传的证书域名与加速域名不匹配(泛域名证书 *.example.com 不覆盖 example.com 本身,也不覆盖二级以下子域名);只上传了服务器证书没有带中间证书,导致部分客户端校验失败;证书过期未及时更新。另外要区分两段链路:客户端到 CDN 的 HTTPS 用的是你在 CDN 上配置的证书,而 CDN 到源站的回源协议需要单独设置。如果回源选择 HTTPS,源站必须正确部署证书并监听 443 端口;回源走 HTTP 则要确认源站 80 端口可用。可用下面的命令检查证书链:

openssl s_client -connect cdn.example.com:443 -servername cdn.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates

坑五:回源 Host 与源站配置不匹配。 源站如果按虚拟主机区分站点,CDN 回源时携带的 Host 头不对,就会返回默认站点或 404。使用对象存储服务 OBS 作为源站时,还要注意桶的访问权限,私有桶需要配置相应的回源授权,否则回源会被拒绝。

六、排障清单

遇到问题时,可以按下面的顺序逐项核对:

  • [ ] 加速域名的 CNAME 是否已生效(dig 查看解析结果);
  • [ ] 源站直接访问是否正常,返回的 Cache-Control、Expires、Set-Cookie 是什么;
  • [ ] 是否开启了遵循源站缓存策略,与预期是否一致;
  • [ ] 缓存规则的匹配类型、优先级是否正确,有无兜底规则覆盖;
  • [ ] URL 参数是否导致缓存键分散;
  • [ ] 连续请求时 Age 是否增长,响应耗时是否下降;
  • [ ] 发版后是否提交了刷新,任务状态是否已完成,提交的 URL 是否与访问 URL 完全一致;
  • [ ] 是否先刷新后预热;
  • [ ] 证书域名、证书链、有效期是否正确,回源协议与源站端口是否匹配;
  • [ ] 回源 Host、OBS 桶权限等源站侧配置是否正确;
  • [ ] 是否排除了浏览器本地缓存的干扰(无痕窗口或 curl 测试)。

结语

CDN 缓存的核心就是三件事:缓存什么、缓存多久、何时失效。把动静分离、规则优先级、源站缓存头这几个概念理顺,再配合版本化文件名和规范的刷新预热流程,就能在提高命中率、降低源站压力的同时,保证用户及时看到最新内容。遇到异常时别急着改配置,先用 curl 看清响应头,大多数问题答案就写在那里。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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