nginx リバース プロキシ経由でコンテナに大きなファイル (>2 GB) をアップロードするときにエラーが発生しました

nginx リバース プロキシ経由でコンテナに大きなファイル (>2 GB) をアップロードするときにエラーが発生しました

私はDockerコンテナでアプリケーションを実行しています(https://github.com/filebrowser/filebrowser/) に非常に大きな (>2) GB のファイルをアップロードしようとしています。コンテナーは、リバース プロキシ経由で接続する localhost の非標準ポートでアプリを公開します (そのため、1 台のマシンで複数のアプリを実行できます)。問題は、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_buffers追加proxy_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

簡単な答え:

  • proxy_request_buffering off;問題は解決します。それが唯一の関連するオプションだからです。アップロード(リクエスト)。

その他のオプションは、ダウンロードクライアントに(応答)。ドキュメントから引用:

  • proxy_buffer_size

    ...最初の部分を読み取るために使用されるバッファのサイズ応答プロキシサーバーから受信しました...

  • proxy_buffers

    ...読み取りに使用されるバッファ応答プロキシサーバーから...

  • proxy_busy_buffers_size

    ...バッファリング時に反応プロキシサーバーから...

答え2

私も 2GB の制限に達しました。proxy_request_buffering off;私の場合はうまくいきませんでした。以下の 2 つのオプションを/場所に追加することが、私にとって唯一うまくいった方法です。

proxy_buffering      off;
client_max_body_size 0;

関連情報