一、线上 HLS 出故障,分不清找 CDN 客服还是后端开发
线上 M3U8 点播直播出现播放异常,很多运维测试拿到问题,不知道该把问题提交给 CDN 服务商工单,还是找自己公司后端切片服务开发。分不清边界,工单提错对象,来回拉扯,耽误故障处理时间。
核心简单区分思路: 拿到源站(回源源站直接访问,绕过 CDN)的 M3U8 做基准。源站直接访问就复现故障 → 属于后端切片、转码、源站 Nginx 问题;源站访问完全正常,经过 CDN 之后才出现异常 → 问题归属 CDN 侧。
很多新手忽略做绕过 CDN 的源站基准对比,直接找 CDN 或者后端,两边互相说明自己没问题。
注意:有部分混合场景,源站和 CDN 两边配置都有缺陷,需要两边同时修改。遇到这类线上问题,我会使用 m3u8live.cn,分别加载源站直连 M3U8、经过 CDN 域名的 M3U8,对照两份流的表现、响应头、M3U8 原始文本。
二、大概率属于后端切片 / 源站服务端问题(绕过 CDN 访问就复现)
- FFmpeg 转码切片产物问题:分片损坏、GOP 不对齐、PTS 时间戳错乱、缺少 DISCONTINUITY 标记;
- Nginx 源站配置:MIME‑Type、CORS 跨域头、Cache‑Control 缓存头配置错误;
- 源站鉴权逻辑:token 签名、Referer 校验逻辑 BUG;
- AES‑128 密钥服务,密钥生成错误、IV 向量错误;
- FFmpeg HLS 参数错误:hls_list_size、independent‑segments 等参数配置错误;
- 源站磁盘分片堆积、分片清理脚本失效,分片文件丢失;
- M3U8 索引文本标签语法错误、BOM 头、VERSION 版本号配置错误。
判断依据:绕过 CDN,直接访问源站 IP / 源站域名,故障现象可以复现。问题根源在自己业务后端源站。
三、大概率属于 CDN 侧问题(源站直连访问完全正常,经过 CDN 之后出问题)
- CDN 节点缓存旧的 M3U8、旧 TS 分片,源站已经更新,CDN 返回旧缓存内容;
- CDN 改写、覆盖源站返回的响应头:CORS、Cache‑Control 被 CDN 错误覆盖;
- CDN 回源风暴、回源策略配置不合理;
- CDN 节点部分节点访问 404、502,部分节点播放正常;
- CDN 对请求 UA、Referer 做异常拦截,源站访问正常,CDN 节点返回 403;
- CDN 代理改写 M3U8 报文内容出错,sub_filter 字符串替换异常。
判断依据:源站直连访问 M3U8,播放、响应头、M3U8 文本全部正常;只有走 CDN 域名访问才复现故障。提交 CDN 工单,附带源站对比样本。
四、需要两边同时排查的混合场景
- 源站输出相对路径 M3U8,CDN 网关改写域名逻辑,源站和 CDN 配置要配套;
- CORS 跨域头:源站配置正确,CDN 又把跨域头删除,需要 CDN 侧也开启透传响应头;
- 防盗链鉴权:源站鉴权逻辑没问题,CDN 开启额外的 WAF、访问控制,叠加拦截造成 403。
五、故障排查标准流程
- 获取两份 M3U8 地址:①绕过 CDN,直接访问源站地址;②正常业务 CDN 域名地址。
- 两份链接分别放到网页调试工具,对比播放现象、F12 响应头、M3U8 原始文本。
- 如果源站直连就复现 BUG → 找公司后端切片、Nginx 源站开发;
- 如果源站完全正常,只有 CDN 域名复现 → 提交 CDN 服务商工单,附上源站的对照复现样本;
- 如果两边表现不一样,重点对比两份请求返回的响应头、M3U8 文本差异,定位是缓存、改写、头覆盖问题。
六、总结
HLS 线上故障,优先做绕过 CDN 源站直连对照测试。源站直接访问就复现问题,故障属于后端切片、源站 Nginx、转码逻辑;源站访问一切正常,经过 CDN 域名之后才异常,问题归属 CDN 节点、缓存、回源、响应头改写逻辑。也存在部分场景源站与 CDN 配置都需要调整。借助网页调试工具,对比源站直连与 CDN 两份 M3U8 的表现、响应头、索引文本,就可以快速判断该找谁处理故障,减少互相拉扯,提升线上问题处理效率。