Ошибка загрузки больших файлов (>2 ГБ) через обратный прокси-сервер nginx в контейнер

Ошибка загрузки больших файлов (>2 ГБ) через обратный прокси-сервер nginx в контейнер

Я запускаю приложение в контейнере Docker (https://github.com/filebrowser/filebrowser/), на который я пытаюсь загрузить очень большие (>2) ГБ файлы. Контейнер предоставляет приложение на нестандартном порту на localhost, к которому я подключаюсь через обратный прокси (чтобы я мог запускать несколько приложений на одной машине). Проблема в том, что когда я загружаю файл размером более 2097152 байт, он выдает ошибку. Я вижу, что файлы полностью загружены в nginx и что они частично попадают в contianerized приложение, но затем долго зависают на 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_size, proxy_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

Я также достиг предела в 2 ГБ. proxy_request_buffering off;не сработало для меня. Добавление двух опций ниже в /местоположение — единственное, что сработало для меня:

proxy_buffering      off;
client_max_body_size 0;

Связанный контент