使用nginx代理到webman,download()方法下载文件间歇性失败

西湖的水我的泪

问题描述

使用ngxin反向代理到webman服务的8787端口,webman提供了一个下载功能,使用的response()->download()方法下载大小超过2M的文件,16个进程,前端使用window.open()打开该链接下载文件,会间歇性出现下载失败的问题,大多数时候可以,但是不稳定,不时出现下载失败的情况。
这个下载服务是收费的必须要稳定运行才行吖请大佬们帮忙看看是么子问题,跪谢。

截图报错信息里报错文件相关代码

nginx代理配置:

CleanShot 2022-10-21 at 18.14.35@2x.png截图

webman代码:

CleanShot 2022-10-21 at 18.22.34@2x.png截图

前端:
下载的其实是同一个文件,间歇性失败

CleanShot 2022-10-21 at 18.24.01@2x.png截图

nginx错误日志:

CleanShot 2022-10-21 at 18.27.55@2x.png截图

日志中的crit日志下载成功也会产生,error日志只有下载失败时产生

操作系统及workerman/webman等框架组件版本

 macOS 13
 webman 1.4

搞定啦我来还愿来了谢谢各位大佬

事情是这样的,虽然有个缓存目录无权限报错,但我测试了一下大概和这茬没啥关系= =
主要还是代理缓存大小的问题,我在nginx中使用如下配置解决了问题

proxy_buffering  on;
proxy_buffer_size 500M;
proxy_buffers 4 500M;
proxy_busy_buffers_size 500M;
proxy_temp_file_write_size 500M;

个人猜测问题是这样产生的,nginx反向代理到webman,因为代理的是本地端口,所以webman很快就把所有的内容都交付给了nginx了并断开了和nginx的连接;但是nginx默认的代理缓存很小,只保存了webman交付内容的很少一部分,然后就被webman断开了连接,nginx无法获取到剩下的内容,因此报了[上游链接过早断开]的错误,这里我把代理缓存加到500M就可以了,具体加到多少根据实际需求调节,我这里是需要测试一个400多M的压缩包

1109 4 1
4个回答

six

webman debug方式运行看下,可能报错了

  • 西湖的水我的泪 2022-10-21

    = =就是在debug模式下运行的,然而在命令行中也没有报错,在webman的运行日志中也一切正常= =,我怀疑是download方法大于2m的文件异步加载导致的这个问题,不确定

  • six 2022-10-21

    不走nginx,直接用8787端口下载看看有没问题

  • 西湖的水我的泪 2022-10-21

    直接走8787端口没问题

  • 西湖的水我的泪 2022-10-21

    我测试了一下,基本可以确定就是nginx代理的问题,直接访问8787端口完全没问题,走nginx代理就很容易复现这个问题

  • liziyu 2022-10-22

    二者之间通讯问题

  • 西湖的水我的泪 2022-10-24

    谢谢大佬,搞定了,文章已更新,共勉

mine

nginx配置,if判断那里加上client_max_body_size 200M; 试试。

tanhongbin

nginx 配置代理使用长链接,估计是有超时问题

mon

nginx server 里面加上 proxy_set_header connection keep-alive

年代过于久远,无法发表回答
🔝