视频播放服务器故障,现象一般很直观,用户打开视频不断加载转圈、黑屏或是直接弹出报错。但故障根源差别很大。很多人第一反应重启服务,重启之后短暂恢复,几分钟再次异常,这类情况基本不是进程本身问题,而是依赖的某个环节出错。排查需要遵循顺序,从外部到内部,由简单到复杂。
第一步确认服务运行状态,执行systemctl status nginx或者systemctl status apache2,查看进程状态是active还是failed。如果状态为failed,日志一般会标注故障原因。Nginx error.log路径/var/log/nginx/,Apache日志放在/var/log/apache2/。不用一次性读取完整日志,先用tail读取最后五十行,最新报错信息就是线索。配置文件写错是简单故障,运行nginx -t校验语法,会提示出错行号,修改完成直接reload即可。

服务正常运行,视频依旧无法播放,下一步检查端口和防火墙。ss -tlnp | grep 80确认监听端口正常。云服务器存在两层防火墙,系统层面ufw或者firewalld,还有云平台安全组。很多人只配置系统防火墙,忽略安全组,外部网络无法接入。curl -I http://localhost测试本地访问,本地访问正常外网无法连接,基本判定防火墙拦截。
视频文件本身也会引发故障。核对文件路径,检查权限。Web服务器进程一般使用www-data或者nginx用户运行,如果视频文件由root账号上传,权限设置600,Web服务没有读取权限,视频无法加载。文件执行chmod 644,目录设置chmod 755。HLS、DASH这类分片流媒体格式,核对m3u8或者mpd文件内分片路径,确认所有分片文件完整。转码中途中断,m3u8文件存在,但部分ts分片丢失,播放器加载中途卡住。
资源瓶颈属于高频诱因。视频服务器消耗带宽和磁盘IO,CPU不是首要压力项。iftop或者nload查看实时带宽,出口带宽跑满,新用户访问视频持续转圈。iostat -x 1查看磁盘%util,数值接近100%代表磁盘IO打满,视频读取受阻。内存使用free -h查看,available数值偏低并且swap持续上涨,整机响应变慢。视频服务器依靠内存做文件缓存,内存不足,多个用户读取同一个视频会反复读取磁盘,IO压力成倍上升。
Nginx用来分发视频,几个配置项需要核查。sendfile on建议开启,实现文件直接从磁盘传输至网卡,跳过用户态。tcp_nopush on搭配tcp_nodelay on,降低网络延迟。client_max_body_size数值过小,上传视频请求直接拒绝。keepalive_timeout适度调大,视频播放属于长连接持续传输,超时时间太短会断开连接。
视频编码不兼容同样造成播放失败。服务器存放H.265编码MP4,用户浏览器仅支持H.264,视频无法播放。这种场景服务器日志一般没有明显报错,文件传输正常,问题出在客户端解码。可以用ffmpeg转码,ffmpeg -i input.mp4 -c:v libx264 -c:a aac output.mp4,转成通用格式。直播流媒体场景核对推流端与播放端协议,RTMP推流搭配HLS播放是常用组合,但延迟高于WebRTC。
CDN回源故障很容易忽略。视频使用CDN分发,用户播放失败,有可能CDN回源访问源站出现异常。查看CDN缓存命中率,命中率过低,每次请求全部回源,源站压力大,用户等待时间变长。CDN后台一般有回源日志,查看有没有5xx错误。部分场景源站安全策略封禁CDN节点IP,回源请求被拒绝,用户端视频加载失败。
日志读取要掌握方法。Nginx access.log里面,视频请求常见206状态码,代表分段传输。大量出现200状态码,说明播放器反复请求完整文件,没有使用range分段请求,大概率播放器配置问题。499代表客户端主动关闭连接,用户等待超时关闭页面。500、502属于服务器内部错误,继续查阅error.log定位问题。
排查优先采用排除法。先测试本地服务器播放,接着内网其他机器测试,最后外网测试,逐步缩小故障范围。本地播放正常外网不行,故障在网络链路或者防火墙。内网正常外网异常,大概率DNS解析或是公网带宽问题。全部环境都无法播放,故障在服务器本身。
还有简单有效的测试方式,更换小型视频文件测试。替换小文件能够正常播放,说明服务器运行正常,原视频文件损坏。更换文件依旧无法播放,故障在服务器配置或者网络。这个办法快速缩小问题范围。
视频服务器故障不一定是单一原因,多个小问题叠加引发异常。磁盘即将占满,带宽接近上限,同时某个视频文件权限配置错误,多个问题叠加,故障现象杂乱。逐个排查,修改一项就做一次测试,不要一次性批量修改多处配置,否则无法定位哪一处改动解决问题。