如何解决Nginx反向代理1G大文件下载异常?

Nginx

1 前言

1.1 问题描述

笔者的Nginx反向代理代理云存储一直工作良好,但最近有用户反映批量下载文件出现超过1G文件传输中断问题。

1.2 相关的错误提示

2021/06/08 13:55:26 [error] 23182#23182: *5571919 upstream prematurely closed connection while reading upstream, client: 10.168.0.24, server: nextcloud.cmdschool.org, request: "GET /remote.php/webdav/MyISO/deepin-desktop-community-20.2-amd64.iso?downloadStartSecret=ku6ho1ghqw HTTP/1.1", upstream: "https://10.168.0.30:443/remote.php/webdav/MyISO/deepin-desktop-community-20.2-amd64.iso?downloadStartSecret=ku6ho1ghqw", host: "nextcloud.cmdschool.org"

注:经过测试反向代理服务器如果用两个域名的虚拟服务同时代理同一台上游服务器也可能出现以上错误。

1.3 故障分析

Client Browser <—> Reverse Proxy Server <—> Web Server

如上图所示,正常情况下反向代理按如下流程工作,
– 客户端浏览器透过反向代理服务器请求Web服务器提供资源
– Web服务器返回资源并缓存到反向代理服务器
– 反向代理服务器将文件递给客户端浏览器

特殊的环境因数分析,
– 客户端浏览器与反向代理服务器之间使用百兆或千兆级别以太网通讯
– 反向代理服务器与Web服务器使用万兆级别以太网通讯

另外,我们使用共同一Web服务器的另外一个反向代理却能正常地下载超过“1024M”的文件,
– 客户端浏览器与反向代理服务器之间使用百兆或千兆级别以太网通讯
– 反向代理服务器与Web服务器使用10级别专线网络通讯

传输中断原因分析(以下是个人分析,并无官方支持,只作参考),
– 由于上游反向代理服务器与Web服务器使用万兆网络下游反向代理服务器与Web服务器使用百兆网络
– 所以上游相较于下游通讯速度极快
– 另外由于反向代理临时文件缓冲区存储参数“proxy_max_temp_file_size”默认值为“1024m”
– 反向代理从上游Web服务器取得数据快速填满临时文件缓冲区的“1024m”空间后与Web服务器断开链接
– 此时下游客户端浏览器与反向代理的数据传输仍在继续缓慢传输
– 上游反向代理服务器与Web服务器等待至预设的响应超时值(默认60秒)后断开连接且不再下载剩余数据
– 此时下游客户端Web浏览器下载完“1024M”数据后即出现下载异常

2 最佳实践

2.1 实践环境

如果你没有反向代理环境,请按如下链接建立,

如何部署反向代理服务器Nginx?

2.2 设置一,不限制临时文件大小

vim /etc/nginx/nextcloud.cmdschool.org.conf

加入如下配置,

server {
    #...

    location / {
        #...
        proxy_max_temp_file_size 0;
        #...
    }
}

配置修改完成后,需要重载服务使配置生效,

systemctl reload nginx.service

注:缓冲区大小无限制,一直下载完整个文件

2.3 设置二,关闭代理响应缓存(可选)

vim /etc/nginx/nextcloud.cmdschool.org.conf

加入如下配置,

server {
    #...

    location / {
        #...
        proxy_buffering off;
        #...
    }
}

注:参数“proxy_buffering”设置为“off”则回应收到立刻同步传递到客户端
配置修改完成后,需要重载服务使配置生效,

systemctl reload nginx.service

参阅文档
===================
http://nginx.org/en/docs/http/ngx_http_proxy_module.html

https://stackoverflow.com/questions/24453388/nginx-reverse-proxy-causing-504-gateway-timeout

https://github.com/owncloud/client/issues/5706

没有评论

发表评论

Nginx
如何解决Nginx代理传大文件不同步问题?

1 前言 一个问题,一篇文章,一出故事。 笔者生产环境遇到用户透过反向代理上传大文件提示用户已经完成 …

Nginx
如何实现Nginx根据路径分配代理?

1 前言 一个问题,一篇文章,一出故事。 笔者生产环境遇到需要根据URI路径选择走哪个代理服务器的案 …

Nginx
如何实现Nginx返回字符串或变量值?

1 前言 一个问题,一篇文章,一出故事。 笔者测试环境中经常需要返回Nginx变量的具体值,于是整理 …