nginx-排查一次大文件无法正常下载问题

时间:2024-03-11 22:22:47

目录

问题现象&报错信息

问题现象以及分析

nginx报错信息

问题解决

方法1:配置proxy_max_temp_file_size

方法2:关闭proxy_buffering

参考文档


问题现象&报错信息

问题现象以及分析

  • 文件正常从后端服务器直接下载时,一切正常。但是通过nginx反代后,使用wget命令下载到1GB时,wget会重试一次(重新开始下载),然后重试后立即失败。--判断1.nginx可能有1GB缓存之类的限制
  • 在网络带宽情况较好的内网直接下载,不会出现问题;当下载速度受限,需要较长时间下载时,问题必现(下载到1GB中断)。--判断2.此问题与网络传输速度也有关联
  • 对比测试时,使用另一套文件下载服务,使用同样的nginx作为反代。另一套文件下载服务下载10GB文件未复现问题。--判断3.后端服务传输方式也存在问题

#wget限制下载速度10MB/s,模拟网络带宽受限,复现问题。

wget --limit-rate=10M

nginx报错信息

2024/02/27 17:08:49 [error] 2297567#0: *5206 upstream prematurely closed connection while reading upstream, client: 10.1.1.1, server: file.example.com, request: "GET /file/test/test.zip HTTP/1.1", upstream: "http://10.10.10.10:80/file/test/test.zip", host: "file.example.com"

关键信息:upstream prematurely closed connection while reading upstream

读取上有服务器时,上游服务器过早关闭了连接。

  1. 可能上有服务器存在问题,过早关闭了连接。
  2. 可能上有服务器由于内网网络环境较好,很快地传输完了数据,与nginx断开了连接。(与判断2一致)

问题解决

方法1:配置proxy_max_temp_file_size

参考连接:ngx_http_proxy_module - proxy_max_temp_file_size

当启用来自代理服务器地响应缓冲时(proxy_buffering on;),可以将部分响应保存至缓冲区中。该指令设置临时文件的最大值,默认值1024MB。

proxy_max_temp_file_size 2048m;

将此值设置为2GB或者更高,问题解决。

方法2:关闭proxy_buffering

参考连接:ngx_http_proxy_module - proxy_buffering

当proxy_buffering设置为on时,启动缓冲。nginx会尽快从代理服务器接收响应,并将其保存到 proxy_buffer_size和proxy_buffers指令设置的缓冲区中。

如果整个响应无法放入内存,则可以将其中一部分保存到磁盘上的临时文件中。写入临时文件由 proxy_max_temp_file_size和 proxy_temp_file_write_size指令控制。

当禁用缓冲时,响应将在收到后立即同步传递到客户端。nginx 不会尝试从代理服务器读取整个响应。nginx一次可以从服务器接收的数据的最大大小由proxy_buffer_size指令设置。

proxy_buffering off;

关闭后nginx不会尽快接收服务器响应,从而上有服务器不会过早关闭连接。

参考文档

Module ngx_http_proxy_module