为什么通过Nginx下载大文件有时会不完整?

徐福运维2024-07-30 09:57:05  118

今天接到客户的反馈说访问服务下载大文件不全,用客户提供的链接通过浏览器下载的文件只有1.05个G,原文件有近1.3个G,

通过浏览器下载

使用curl命令在服务器上下载是正常的,文件大小没问题,

服务器上直接请求

相同的测试重复了多次,结果仍然是这样。

通过浏览器访问路径是这样,

浏览器--->公有云负载均衡--->Nginx--->后端Java服务

直接在服务器上访问是这样,

Curl--->Nginx--->后端Java服务

直觉判断是公有云负载均衡导致的,提工单反馈这个问题,平台建议将负载均衡的协议从HTTP改为TCP,但问题还是存在,

抓包结果显示客户端主动断开了连接,有点让人摸不着头脑了,

wireshark抓包

继续往上溯源,查询Nginx的错误日志发现下面内容:

2024/07/16 12:02:31 [error] 20256#20256: *284535721 upstream prematurely closed connection while reading upstream, client: x.x.x.x, server: xxx.com"

说明后端Java服务在没有完成文件传输的情况下,主动断开了与Nginx的连接,为什么会这样?

原来Nginx默认有一个缓存(针对单个连接),因为占用内存,默认空间很小,只有几十KB。缓存的大小由“proxy_buffer_size”和“proxy_buffers”这两个参数控制,

proxy_buffer_size

proxy_buffers

这个缓存用来存放从上游服务器接收到的数据,如果收到的数据将缓存填满,Nginx会将收到的数据存放在硬盘中的一个临时文件,文件最大大小由参数“proxy_max_temp_file_size”控制,默认是1G,这个文件也填满后,Nginx将不去请求上游服务器,Nginx与上游的连接默认保持60s,超时后连接会断开。

proxy_max_temp_file_size

明白这个原理后,我们禁用掉缓存,这样Nginx从上游服务器收到的数据将不在本地缓存,收到上游返回的数据后将立即发送给客户,整条下载路径的速度完全由客户端控制,这样就可以解决这个问题。

禁用掉缓存,

禁用nginx缓存

在Nginx配置文件中,增加指令"proxy_buffering off;",问题完美解决。

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/982203.html
0
最新回复(0)