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

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

码农世界 2024-05-30 后端 87 次浏览 0个评论

目录

问题现象&报错信息

问题现象以及分析

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

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

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

    proxy_max_temp_file_size 2048m;

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

    方法2:关闭proxy_buffering

    参考连接:ngx_http_proxy_module - proxy_buffering

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

    当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

转载请注明来自码农世界,本文标题:《nginx-排查一次大文件无法正常下载问题》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,87人围观)参与讨论

还没有评论,来说两句吧...

Top