如何解决反向代理上传大文件报错?

Nginx

1 前言

1.1 问题描述

一个问题,一篇文章,一出故事。
笔者的Nginx反向代理代理云存储换成NextCloud,但最近有用户反映上传大文件失败。

1.2 相关的错误提示

2021/06/08 08:38:49 [error] 1205#1205: *7111239 upstream prematurely closed connection while reading response header from upstream, client: 10.168.0.165, server: nextcloud.cmdschool.org, request: "PUT /remote.php/dav/uploads/00323401-c56f11e3-a663eb64-06a7ea05/web-file-upload-a745ccce113796717acd44927e6364ae-1623112422631/325058560 HTTP/1.1", upstream: "https://10.168.0.30:443/remote.php/dav/uploads/00323401-c56f11e3-a663eb64-06a7ea05/web-file-upload-a745ccce113796717acd44927e6364ae-1623112422631/325058560", host: "nextcloud.cmdschool.org"

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

1.3 基础知识

– HTTP协议属于无状态协议,客户端向服务器发送单个TCP请求,服务端直到响应完成后才断开连接。
– 如客户端与服务器建立多个链接,每连接各自独立且单独传输数据
– HTTP协议可以启用KeepAlive模式声明Web服务器完成请求后保持TCP连接开启状态的时间
– HTTP如果收到来自客户端的其它请求,服务端会利用未被关闭的TCP连接而无需重新建立
– KeepAlive模式下保持开启状态的连接会占用一定的系统资源从而影响服务器的性能
– Nginx的keepalive_timeout参数用于定义KeepAlive的超时时间(timeout)即单独的TCP连接可以保持的时间
– Nginx的keepalive_timeout参数默认值为75秒,设0即禁止keepalive连接(一般浏览器保持60秒,故推荐设60 秒)

2 最佳实践

2.1 实践环境

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

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

2.2 故障修复

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

加入如下配置,

server {
    #...
    keepalive_timeout 8h;
    location / {
        #...
    }
}

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

systemctl reload nginx.service

注:以上能解决问题,但不建议配置,经过测试根本原因为反向代理服务器使用两个域名的虚拟服务同时代理同一台上游服务器引发。

参阅文档
======================
http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive_timeout

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何安装部署RHEL 9 Nignx?

1 前言 一个问题,一篇文章,一出故事。 笔者需要基于RHEL 9部署Nginx环境,于是整理此文。 …