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

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
如何拒绝外网用户访问特定URL?

1 前言 一个问题,一篇文章,一出故事。 笔者有一个认证接口需要拒绝intetnet的用户访问同时允 …

Nginx
如何实现私网地址重写策略?

1 前言 一个问题,一篇文章,一出故事。 笔者的nextcloud需要透过反向代理实现企业外部2FA …