通过 nginx 反向代理将大文件(>2gb)上传到容器时出错

通过 nginx 反向代理将大文件(>2gb)上传到容器时出错

我正在docker容器中运行一个应用程序(https://github.com/filebrowser/filebrowser/),我正尝试上传非常大 (>2) GB 的文件。容器将应用程序公开在 localhost 上的非标准端口上,我通过反向代理连接到该端口(这样我可以在一台机器上运行多个应用程序)。问题是,当我上传超过 2097152 字节的文件时,它会出错。我可以看到文件已完全上传到 nginx,并且部分文件到达了容器化应用程序,但随后在 2097152 字节处挂起很长时间,然后出错,导致容器化应用程序出现意外的 EOF 错误。我怀疑 nginx 出了问题,因为当我直接将文件上传到容器化应用程序时,它工作正常。我尝试在 nginx 配置中添加各种指令,但不知所措。我的站点的 nginx 配置是:

server {
    server_name example.com;
    client_max_body_size    30g;
    proxy_buffer_size       1024k;
    proxy_buffers 4 1024k;
    proxy_busy_buffers_size 1024k;
    proxy_max_temp_file_size 10000m;
    proxy_connect_timeout   10000;
    proxy_send_timeout      10000;
    proxy_read_timeout      10000;
    send_timeout            10000;
    client_header_timeout   10000;
    client_body_timeout     10000;
    
    location / {
    proxy_pass http://localhost:8088/;
    proxy_http_version 1.1;
    proxy_cache_bypass $http_upgrade;

    proxy_set_header Upgrade           $http_upgrade;
    proxy_set_header Connection        "upgrade";
    proxy_set_header Host              $host;
    proxy_set_header X-Real-IP         $remote_addr;
    proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host  $host;
    proxy_set_header X-Forwarded-Port  $server_port;

    proxy_connect_timeout              10000s;
    proxy_send_timeout                 10000s;
    proxy_read_timeout                 10000s;
    }}

我在 nginx 中得到的错误是:

2022/04/14 20:26:56 [error] 3286524#3286524: *13184 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: example.com, request: "POST /api/resources/Fedora-KDE-Live-x86_64-35-1.2.iso?override=false HTTP/1.1", upstream: "http://[::1]:8088/api/resources/Fedora-KDE-Live-x86_64-35-1.2.iso?override=false", host: "example.com", referrer: "https://example.com/files/" 

编辑:经过大量挖掘,似乎解决方案是删除proxy_buffer_sizeproxy_buffersproxy_busy_buffer_size并添加proxy_request_buffering off;我不知道为什么这样做有效,但确实有效。配置中修改的行是:

    # proxy_buffer_size       1024k;
    # proxy_buffers 4 1024k;
    # proxy_busy_buffers_size 1024k;
    proxy_request_buffering off;

答案1

简单回答:


所有其他选项仅适用于下载给客户端(响应)。引用文档中的话:

答案2

我也达到了 2GB 的限制。proxy_request_buffering off;对我来说不起作用。将以下两个选项添加到/位置是唯一对我有用的方法:

proxy_buffering      off;
client_max_body_size 0;

相关内容