先定位瓶颈,再决定缓存策略
打开浏览器开发者工具的 Network,分别观察主 m3u8、子清单、首个切片和后续切片。清单请求快但切片慢,重点看媒体回源与下载;请求都快但长时间黑屏,需要检查编码、播放器或音视频时间戳;只有某些地区慢,再比较对应网络与 CDN 节点的实际响应。给每次测试记录地区、网络、设备和时间,避免把偶发网络变化当成配置改善。
同时记录源站响应时间、CDN 命中状态、响应大小、HTTP 状态码、首帧耗时和卡顿情况。仅看一个“加速已开启”开关,无法确定请求是否真正进入缓存。
回源、域名与 HTTPS 先跑通
- 确定媒体域名:将视频媒体与后台接口区分,确认所选 CDN 产品支持计划中的视频分发方式、对象大小和流量范围。
- 配置源站:明确对象存储或 Web 服务的地址、回源协议、Host 和路径前缀;核对证书覆盖的域名与证书链。
- 验证路径:检查清单里的相对切片路径经过 CDN 后仍能正确解析,避免主清单存在而所有切片 404。
- 防止绕过权限:受限内容应同时限制源站直接访问;CDN 的鉴权必须覆盖真正传输媒体的请求。
HTTPS 页面中的播放清单、切片、字幕和密钥地址也应采用正确的 HTTPS 链接。不要通过关闭源站证书校验解决长期配置问题。
四类资源使用不同的缓存规则
| 资源 | 建议起点 | 需要验证 |
|---|---|---|
| 公开点播、带版本且不可变的切片 | 可较长缓存,以新路径发布新版本 | 同 URL 不会被覆盖成另一段媒体 |
| 已完成且带版本的点播清单 | 可缓存,时长与发布策略匹配 | 清单不会引用已删除或未上传的文件 |
| 持续更新的直播清单 | 短缓存或按直播产品要求处理 | 观众能及时获取新片段 |
| 个性化接口、权限与密钥响应 | 按安全需求禁止共享缓存或采用明确的鉴权缓存方案 | 不同用户不会复用不该共享的内容 |
例如,公开、不可变的点播切片可以评估 Cache-Control: public, max-age=86400 作为测试起点;敏感的个性化响应可使用 Cache-Control: no-store。这些数值与指令不是全站配置模板,具体缓存时间应结合更新、授权与撤回需求确认。
Cloudflare 的默认缓存行为会考虑扩展名、响应状态和缓存相关头部;不能只看媒体的 MIME 类型便断定已缓存。private 表示响应不应保存在共享缓存中,边缘缓存与浏览器缓存也可以有不同策略。默认缓存行为、Origin Cache Control
签名参数与缓存键最容易相互冲突
如果每个用户的播放 URL 都带不同签名,且签名参与缓存键,同一媒体可能产生许多缓存副本。反过来,直接忽略所有参数,也可能把不同版本、不同权限或不同清晰度错误合并。
先列出参数用途:内容版本与画质通常影响实际资源;统计参数不一定影响内容;鉴权参数决定访问资格。只有在边缘对每次请求完成正确鉴权后,才可以评估怎样共享同一公开缓存对象。不要把“从缓存键中删除 Token”当成独立解决方案,更不要先命中缓存再跳过权限检查。
签名有效期还要覆盖用户观看和合理暂停后的请求,或提供安全的续签机制。主清单只检查一次、后续切片完全不受保护,会留下权限缺口;每个切片有效期过短,则可能播放到一半突然出现 403。
用真实 GET 请求检查 CORS 与 Range
跨域播放要逐项检查子清单、切片、字幕与密钥的响应,不能只给主 m3u8 加跨域头。如果响应随请求 Origin 变化,应同时设计相应缓存区分,避免把一个站点的允许来源头复用于另一个站点。涉及浏览器凭据时不能把允许来源简单设为通配符。MDN 跨域与凭据说明
以下示例使用保留示例域名,无真实播放地址。它们用于观察响应头;执行前替换成自己有权测试的媒体资源。Linux/macOS 可将正文写入 /dev/null,Windows 可根据终端环境改用相应输出方式。
curl -sS -D - -o /dev/null \
-H 'Origin: https://www.example.com' \
https://media.example.com/video/v2/index.m3u8
curl -sS -D - -o /dev/null \
-H 'Range: bytes=0-1023' \
https://media.example.com/video/v2/sample.mp4
MP4 或 HLS 的字节范围资源需要检查 206 与 Content-Range;按独立小文件分发的 TS 切片,普通 GET 返回 200 可以完全正常,不能要求所有媒体请求都返回 206。curl 的请求头选项见官方手册。
常见现象与排查顺序
| 现象 | 优先检查 | 验证动作 |
|---|---|---|
| 缓存命中率低、源站流量高 | 签名参数、缓存规则、对象大小限制、响应头 | 重复请求同一 URL,观察命中状态与源站日志 |
| 更新视频后仍播放旧内容 | 覆盖了原路径、旧清单和边缘缓存 | 改为版本目录,核对当前入口指向 |
| 电脑正常,手机拖动失败 | 媒体编码、Range、ETag 和播放器 | 在目标设备抓取拖动后的媒体请求 |
| 开始正常,几分钟后 403 | 签名到期、子资源签名缺失 | 核对失败请求的时间与鉴权日志 |
| 清单 200,但切片 404 | 路径前缀、相对地址、发布顺序 | 逐条解析清单引用并请求首尾切片 |
若使用 Cloudflare 且问题集中在 Safari 的 MP4 Range/ETag 交互,应参考对应问题说明,先确认症状再按站点范围验证规则。不要为排查一个文件,直接让全部视频永久绕过缓存。Cloudflare 的 Safari MP4 排错说明
带宽预算与专业配置范围
可以用“平均实际传输码率 × 总观看时长”估算内容流量,再考虑协议开销、预加载、拖动产生的额外下载与缓存未命中。以 Mbps 计算得到的是比特率,换算字节时还要除以 8;实际账单则按供应商计费单位、地区和套餐规则核对。缓存命中率高通常能降低回源压力,但不等于所有分发费用都消失。
需要会员鉴权、多地区分发、对象存储迁移或播放器联调时,视频平台与分发方案开发可以把缓存策略、权限边界和播放验收一起确定。交付应包含规则说明、测试样本、指标和回退方式,不只是一条 DNS 记录。
视频 CDN 常见问题
接入 CDN 后源站带宽一定大幅下降吗?
不一定。冷门资源、短缓存、大量唯一 URL 或未符合缓存规则的请求仍会回源,需要结合命中率和日志判断。
m3u8 应该永远不缓存吗?
不是。完成后的版本化点播清单与持续变化的直播清单不同,应根据是否会更新、权限要求和发布方式设计。
Referer 防盗链能代替会员权限吗?
不能把它作为完整的会员授权机制。会员访问应由可验证的权限与签名流程控制,并覆盖媒体与源站入口。
