Я запускаю приложение в контейнере 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;