个人博客网站接入了Cloudflare CDN,利用CDN缓存图片、视频静态资源。最近上线视频的上传和播放功能后发现一些问题。
Cloudflare CDN请求body被限制问题
由于偷懒,博客管理后台的视频上传功能只实现非常简单的上传接口。上线后发现上传视频总是上传失败,视频基本在两三百M大小。
起初是怀疑服务端代码使用的web框架限制了请求body大小,但是本地测试并没有这个问题,于是只能怀疑,要么是Railway限制的(服务使用Railway.app部署),要么就是Cloudflare CDN限制的。
折腾一通后,发现原来是Cloudflare限制的。
对于免费用户,单个请求的最大Body大小为100mb,对于付费企业用户,最大也只有500MB。
其实100Mb够用了,大文件上传应该走分片上传。
Cloudflare CDN不支持http Range请求头问题
之前上传两三百m的视频,发现在播放的时候会卡顿一会,起初并没有在意。后来上传一个1G大小的视频,发送卡很长时间都无法播放。
起初还是怀疑自己的代码没有支持http range,但是本地测试,以及线上绕过Cloudflare CDN测试,range请求都是生效的。
通过加日记后发现,请求经过Cloudflare CDN后,Range请求头被干掉了,Cloudflare CDN请求源站的时候并没有带上Range请求头。
另外,通过测试还发现,即便Cloudflare CDN请求源站拿了视频之后,之后的请求命中缓存,Range请求还是不支持,浏览器依然需要等待把整个视频下载完成后才能播放。
解决方案只能是放弃CDN缓存和加速,Cloudflare配置仅DNS解析,绕过Cloudflare CDN,请求直接回源站,但缺点就是费流量,以及视频加载慢。