nginx下视频无法播放的问题排查过程
问题:
部署了nginx,测试页面访问正常,添加了mp4支持模块后mp4无法播放
排查过程:
. 用开源flash jw 播放视频,无法播放,怀疑flash的问题,查看mp4扩展模块官方的例子,用那个flash(其实也是jw)测试,还是无法播放,抓包发现是没有crossdomain.xml
观察其他视频网站的crossdomain.xml的编写方法,添加crossdomain.xml,调整nginx配置,使视频能下载,测试时下载时把视频url出入浏览器,发现确实能下载。但是flash仍然无法播放。
. 浏览器中输出视频下载地址,下载视频,发现视频与源文件不一致,视频无法用播放器播放
. 怀疑是mp4扩展模块编译的问题,严格按官方文档中的方法编译,结果不变
. 用mp4查看工具查看文件,发现文件格式错误,工具无法打开
. 怀疑是这个扩展模块的问题,使用官方的mp4扩展模块,重新编译nginx,结果不变
. 怀疑是nginx版本问题,下载网上教程中的版本(官网页面不提供这个版本的下载,但是修改最新版下载地址的版本号后居然可以下载),严格按中的方法重新编译,结果不变
. 怀疑是nginx配置的问题,按网上教程中的配置覆盖原来的配置,结果不变
. 怀疑视频源有问题,下载流媒体网站的一段视频,发现放到网站上,通过nginx下载后仍无法播放,用播放器打开视频文件,发现有时候完全不能打开,有时候提示一部分头部信息,但是不全。
. 抓包下载包,发现有多余的可疑字符
. 对比源文视频和下载的视频(用ue二进制比较和文本比较都可以),同样发现有多余可以字符,每隔几k就会多一段字符
. 构建测试页面,10000行,每行一段字符aaaaaaaaaa,浏览页面,发现同样被篡改,证明不是mp4扩展模块的问题
. strace 进程,发现nginx并非读取文件然后发送给浏览器,而是用了一个nb的函数sendfile64,怀疑是这个函数的问题
. 网上搜索这个函数和nginx,找到了nginx的配置文件有关于这个函数的是否启用的配置,关闭这个配置项,问题解决
总结一下问题的排查过程,
第一步,下载视频,定位到问题server上,开始没开抓包工具,没发现是crossdomain的问题,浪费了一些时间
第二步,定位到是输出多了一些无意义的字符,这步做了大量尝试,浪费了大量时间,正确的方法应该是开抓包工具观察,或者用工具对比文件,应该可以很快观察到是多了一些字符。
第三步,定位到是nginx的问题,而不是mp4扩展模块的问题,开始因为测试页面正常,没怀疑nginx本身,浪费了很多时间才用写程序输出长页面,然后测试。
第四步,对nginx返回的错乱,一度绝望,找不到解决方法,应该及时使用strace观察
归纳为3点
1. 抓包工具要一直开着,帮助定位问题,而不是靠猜测
2. 凡是可疑的地方,都要做测试,这次没怀疑nginx本身就是个很大错误
3. 要善于使用已知的方法解决实际的问题,本次的问题主要就是抓包和strace两个工具解决的