龙空技术网

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

徐福工程师 3282

前言:

而今咱们对“nginx缓存数据重复”大致比较注重,大家都想要剖析一些“nginx缓存数据重复”的相关文章。那么小编也在网络上收集了一些有关“nginx缓存数据重复””的相关内容,希望看官们能喜欢,我们一起来了解一下吧!

今天接到客户的反馈说访问服务下载大文件不全,用客户提供的链接通过浏览器下载的文件只有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;",问题完美解决。

标签: #nginx缓存数据重复