记录一次 cf tunnels 上传文件一直失败的解决方案。
本文会记录下整个过程,以及自己怎么发现并且解决问题,文笔差劲。
前因
- 我把家宽(有公网,封禁常规 Web 端口)NAS 部署的服务从腾讯 EO 迁移到 Cloudflare(后续简称 cf),采用的是 cf tunnels 开放内网的形式。
- cf tunnels 是通过 Docker 部署的。
- 为了体验更好,就又买了一个域名,弄 IP 优选,论坛有具体教程,这里就不多叙述了。
- 部署了个人写的博客网站(其实是一个多用户博客,但是目前仅对自己开放)。
问题点:上传文件一直失败
- 想上传文件图片作为博文的封面,但是发现上传一直失败,在 openlist、minio 上面上传也失败。
- 不通过 cf 直接通过端口访问博客,可以正常上传。
- 通过加速域名访问,发现不能上传。
想方设法解决问题
- 修改 cf 的配置。WAF 跳过、https、上传文件大小设置成 100M,超时时间默认 120s,发现还是没有效果。
- 修改 nginx 配置,也是没用,仔细想一下,我通过源站能上传文件,nginx 肯定是没有问题的,自己还是操作多余了,不过为了谨慎,还是做了一些调整。
- 优化代码,减少接口调用时间,图片会存储原图和一张 webp 图,发现原图以 80% 的质量压制成 webp 调用的类库很慢很慢,就换成了一个比较快的类库(截至发文的时候发现和 linux 不兼容,还没修复)。
- 通过 https 界面,把上传接口改成源地址的接口,发现 https 调用 http 会报错,但是源地址,又不想去弄 ssl 证书(感觉麻烦,而且还要定期续)。
- 在看博客的后台日志记录的时候,发现管道根本就没有具体的执行我接口,就已经被超时中止了,我就开始怀疑是不是在接口调用之前,程序在接受文件,文件还没接受完毕,就被中止了。从而导致上传失败。
最终解决方案
- V2EX 的帖子,在下面的评论中找到一个用户的评论,死马当活马医了,在 tunnels 的启动参数里面添加一个
--protocol http2启动参数。 - 重新测试上传,飞牛界面显示下载速度有 1M/s 而且速度是立刻拉上来的,看来问题已经完美解决了。
最后,解决方案可能两种
因为我不确定是我重启了 tunnels 网速变好了,还是添加了参数网速变好了。
- 重启 Tunnels
- 添加启动参数
--protocol http2, 参数的具体作用我就不去查询了。
感谢各位佬听我 bb。我也是分享一下我自己解决问题的全路径。