给网站套上 CDN 之后,大多数人的第一反应是"快了",第二反应是看账单和命中率报表:命中率怎么才 60%?回源流量怎么这么大?这两个数字其实是一件事的两面——命中率低,回源就多,源站带宽费用和回源请求费用都会跟着涨。这篇文章把阿里云 CDN 的缓存规则、回源逻辑和刷新预热机制拆开讲清楚,读完你可以对照自己的配置把命中率拉上来。
一、一个请求在 CDN 里是怎么走的
用户请求加速域名时,请求先落到离用户最近的 L1 边缘节点。边缘节点上缓存还没有这个资源(MISS),就去回源层节点要;回源层也没有,才真正回到源站拉取。资源沿着这条链逐层缓存,后续请求直接在边缘命中(HIT),不再打扰源站。
判断一个请求有没有命中缓存,不用猜,看响应头:
curl -I https://cdn.example.com/static/logo.png
返回头里找 X-Cache 字段:HIT 表示命中节点缓存;MISS 表示没命中、已经回源。再配合 Via 头可以看到整条链路上经过了哪些节点。排查命中率问题时,先拿几个典型 URL 各 curl 一次,比翻报表更直接。
二、缓存时长:三层规则的优先级
一个资源在节点上缓存多久,由三层配置决定,优先级从高到低:
| 优先级 | 来源 | 说明 |
|---|---|---|
| 1 | 源站缓存策略跟随开关 | 控制台开启「优先遵循源站缓存策略」后,源站返回的 Cache-Control 优先生效,覆盖控制台规则 |
| 2 | 控制台缓存规则 | 按目录或文件后缀名配置过期时间,配合权重决定多条规则谁生效 |
| 3 | 默认缓存时间 | 源站和控制台都没配时,默认 3600 秒(1 小时) |
控制台规则的几个关键参数:
| 参数 | 取值 | 要点 |
|---|---|---|
| 类型 | 目录 / 文件后缀名 | 目录用路径前缀匹配,/ 匹配所有路径;后缀名不带点、逗号分隔、区分大小写 |
| 过期时间 | 0 秒 ~ 3 年 | 动态内容(PHP/JSP)建议 0 秒不缓存 |
| 权重 | 1 ~ 99 | 数值越大优先级越高;同权重先创建的生效;一条规则命中后不再往下匹配 |
另外三个开关容易搞反,单独说明:
- 忽略源站不缓存标头:开启后,源站返回的
Cache-Control: no-store、no-cache、max-age=0和Pragma: no-cache都会被忽略,仍按控制台规则缓存。源站框架默认输出 no-cache 头、导致 CDN 全部 MISS 的场景,就是靠这个开关救回来的。 - 强制内容重新验证:只在过期时间为 0 秒时生效。开启后节点仍缓存文件,但每次请求都回源做 304 验证——适合"内容必须新鲜、但想省源站带宽"的接口类资源。
- 客户端跟随 CDN 缓存策略:开启后节点会把生效的 max-age 返回给浏览器,控制客户端侧缓存。
还有一个隐藏规则:如果源站响应带了 ETag,客户端请求带 If-Match 且值匹配时,节点直接返回缓存内容;不匹配才回源。这个校验的优先级高于控制台配置的缓存规则。
三、缓存时长怎么配:一张建议表
| 资源类型 | 建议缓存时长 | 理由 |
|---|---|---|
| 图片、安装包等不常更新的静态资源 | ≥ 1 个月 | 更新频率极低,缓存越久回源越少 |
| JS、CSS 等频繁更新的静态资源 | 1 ~ 7 天 | 配合版本号命名使用 |
| 动态内容(PHP/JSP 等) | 0 秒 | 缓存了就是事故 |
比配时长更重要的一个习惯:源站更新用版本号命名,不要同名覆盖。也就是 img-v1.0.jpg、app-v2.1.js,而不是改完内容还叫 img.jpg。同名覆盖时,旧缓存要等过期或手动刷新才会失效;版本号命名则天然生成新 URL,缓存零冲突。
还有一条官方明确提醒过的:控制台新增或修改缓存规则,只对之后新缓存的资源生效,已经缓存的旧资源继续沿用旧策略到过期。想让新规则立即对全网生效,必须手动执行刷新。
四、刷新与预热:机制和配额
刷新是让节点上的旧缓存失效,预热是高峰前把热点资源提前拉进节点。功能本身不收操作费,但刷新和预热引发的回源流量、回源请求,按源站自己的计费规则收(源站是 OSS 就收 OSS 回源费,是 ECS 就收带宽费)。批量操作放在业务低峰期执行。
| 操作方式 | 每日配额(每账号) | 机制说明 |
|---|---|---|
| URL 刷新 | 10000 条 | 直接删除指定文件缓存 |
| 目录刷新 | 每次 ≤100 条,单域名每分钟 ≤100 条 | 默认"标记刷新":回源时带条件请求,源站返回 304 就继续用旧副本 |
| 正则刷新 | 20 条 | 同为标记刷新,仅支持 4 种正则模式 |
| URL 预热 | 1000 条,每次 ≤100 条 | 仅支持具体文件 URL,不支持目录;任务 5~30 分钟完成 |
两个容易踩的点:
- 标记刷新 ≠ 强制删除。控制台的目录刷新默认是标记过期,回源时源站返回 304 的话,旧缓存会继续被使用。源站同名覆盖更新后目录刷新却"刷不掉",就是这个原因。要无条件清除,需调用刷新 API 并把
Force参数设为true,强制刷新不做 304 校验。 - 预热只进回源层,不保证所有边缘节点立即命中。预热的作用是降低首次集中访问时的源站压力,用户首次访问某个 L1 节点仍可能 MISS,这不算预热失败。刷新和预热任务提交后 5~6 分钟全网生效,任务一旦提交无法中止。
五、计费要点:命中率直接连着账单
CDN 默认按流量计费,中国内地流量阶梯价从 0.24 元/GB(月累计 0~10TB 档)起步,用量越大单价越低,按小时出账、当月账户维度阶梯累进。HTTPS 请求数、QUIC、实时日志推送属于增值服务,用了才另行收费。价格以官方页面实时展示为准。
命中率每提升一个百分点,回源流量就少一截,源站那边的带宽和请求费用跟着降。所以缓存配置是少数"认真调一次、长期省钱"的配置项。
六、顺带说一个停开的坑:边缘函数
调研期间确认的一个事实,写出来帮后来人省时间:阿里云 DCDN 的边缘函数(EdgeRoutine)已于 2025 年 5 月 1 日 0 点起停止新用户开通,存量用户不受影响,官方建议有该需求的新用户改用边缘安全加速 ESA 的函数和 Pages 能力。如果你的方案里还写着"用 DCDN 边缘函数做 XX",先确认账号能不能开通,别做到一半发现入口都看不见。
七、避坑清单
- 命中率低先 curl 看响应头,确认
X-Cache是 HIT 还是 MISS,再查缓存规则,别急着升配。 - 源站输出
no-cache头导致全量回源的,开「忽略源站不缓存标头」;想以源站为准的,开「优先遵循源站缓存策略」,二选一想清楚再动。 - 动态接口务必配 0 秒不缓存规则,权重设高一点,防止被宽泛的目录规则误缓存。
- 根目录
/规则配低权重当兜底,具体路径和后缀配高权重做精细化,权重相同先创建的生效。 - 静态资源一律版本号命名,杜绝同名覆盖,能省掉绝大多数刷新操作。
- 改完缓存规则要立即生效,必须手动刷新;只改规则不刷新,老资源会沿用旧策略到自然过期。
- 目录刷新"刷不掉"先想想是不是 304 标记刷新,确需强制清除走 API 加
Force=true。 - 批量刷新预热会打源站,挑低峰期、分批提交;预热选真正的热点大文件,小文件让首次访问自然填充即可。
把这三层理顺——缓存时长配对、版本号命名代替同名覆盖、刷新预热用在刀刃上——命中率报表会自己给出答案。CDN 本身的开通和配置入口,见阿里云 CDN 产品页。

