MAATRIX / Блог / Nextcloud: не загружаются большие файлы — причины и решение

Nextcloud: не загружаются большие файлы — причины и решение

Nextcloud: не загружаются большие файлы — причины и решение

MAATRIX

Мелкие файлы летят без проблем, а большой архив или видео обрывается: 413 Request Entity Too Large, 504 Gateway Timeout или просто зависает на 99%. Nextcloud не загружаются большие файлы — типичная проблема, и почти всегда виноват не сам Nextcloud, а лимиты в цепочке nginx → PHP → PHP-FPM. Каждое звено имеет свой потолок, и загрузка падает на самом строгом. Разберём все лимиты и настроим их согласованно, чтобы большие файлы проходили целиком.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Почему большие файлы — особый случай

Загрузка большого файла отличается от мелкого не количественно, а качественно: она долгая и объёмная. Долгая — значит, упирается в таймауты, которые обрывают затянувшийся запрос. Объёмная — значит, упирается в лимиты на размер тела запроса и на память. Мелкий файл проскакивает под всеми потолками, а большой цепляет их один за другим. Поэтому «не грузятся большие файлы» распадается на две группы причин: лимиты размера (ошибка 413) и таймауты (ошибка 504 или обрыв).

Ключевая сложность в том, что путь файла проходит через несколько независимых компонентов, и у каждого свой лимит: веб-сервер nginx, интерпретатор PHP, менеджер процессов PHP-FPM и сам Nextcloud. Фактическим потолком становится наименьшее значение из всех. Можно выставить в PHP хоть 100 ГБ, но если в nginx осталось 100 МБ, файл больше 100 МБ не пройдёт. Поэтому настраивать нужно все звенья согласованно, а не одно наугад.

Диагностируем, какой лимит сработал

Точный код ошибки сразу говорит, куда смотреть. Загляните в лог nginx, PHP и Nextcloud одновременно во время неудачной загрузки.

tail -f /var/log/nginx/error.log
tail -f /var/www/nextcloud/data/nextcloud.log

413 Request Entity Too Large в логе nginx — сработал лимит размера, файл отклонён сразу. 504 Gateway Timeout или обрыв на середине — сработал таймаут, файл начал грузиться, но не успел. 500 с упоминанием memory — не хватило памяти PHP. Определив по коду тип, переходите к соответствующей настройке. Не меняйте всё подряд — по коду ошибки видно, лимит это размера или времени, и это две разные группы параметров.

Обратите внимание на момент, когда происходит обрыв, — он тоже диагностичен. Если загрузка падает мгновенно, ещё не начавшись, это почти наверняка лимит размера: сервер отверг запрос по заголовку Content-Length, не приняв ни байта. Если же индикатор доходит до середины или до 90 с лишним процентов и только там срывается — файл реально передавался, но упёрся в таймаут или в нехватку места при сборке. Наблюдение за тем, где именно останавливается прогресс, экономит время: вы сразу знаете, в какой из двух групп параметров искать причину, и не трогаете лишнего.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под Nextcloud

Лимиты размера в nginx и PHP

Ошибка 413 лечится согласованным поднятием трёх параметров. Первый и самый частый виновник — client_max_body_size в nginx, который по умолчанию всего 1 МБ. Второй и третий — upload_max_filesize и post_max_size в PHP.

В конфиге nginx для сервера Nextcloud:

client_max_body_size 16G;

В php.ini:

upload_max_filesize = 16G
post_max_size = 16G

Здесь критично правило наименьшего: фактический потолок равен минимуму из этих трёх значений. Если nginx стоит 16G, а PHP post_max_size остался 8M — файлы больше 8 МБ не пройдут, и вы будете недоумевать, почему настройка nginx «не работает». Выставляйте все три на один разумный максимум с запасом под ваши задачи. post_max_size должен быть не меньше upload_max_filesize, иначе он станет узким местом. После правки перезагрузите nginx и PHP-FPM.

Таймауты для долгой загрузки

Если файл большой настолько, что заливается дольше стандартных таймаутов, вы получите 504 или обрыв, даже когда лимиты размера подняты. Нужно увеличить время ожидания по всей цепочке: nginx (проксирование к PHP-FPM), PHP (max_execution_time) и PHP-FPM.

В nginx для location Nextcloud:

fastcgi_read_timeout 3600;
proxy_read_timeout 3600;
proxy_send_timeout 3600;

В PHP:

max_execution_time = 3600
max_input_time = 3600

Значение 3600 секунд (час) — щедрый запас для медленных каналов и очень больших файлов; при быстрой сети хватит и меньшего. Как и с размерами, действует правило самого нетерпеливого звена: если nginx оборвёт через 60 секунд, а PHP готов ждать час, загрузка упадёт на nginx. Поднимайте таймауты одинаково везде. После этого длинные загрузки перестанут срываться по времени.

Чанковая загрузка: как Nextcloud грузит большое

Nextcloud не полагается на разовую отправку гигантского файла — он дробит его на части (чанки) и собирает на сервере. Это разумно: если оборвётся один чанк, докачивается только он, а не весь файл. Но чанковая загрузка тоже настраивается, и неверный размер чанка ломает процесс.

sudo -u www-data php occ config:system:set max_chunk_size --value 10485760

Значение задаётся в байтах (здесь 10 МБ на чанк). Логика: каждый отдельный чанк должен свободно укладываться в лимиты размера и таймаута, разобранные выше. Слишком большой чанк снова упрётся в 413 или таймаут; слишком мелкий создаст лишние накладные расходы на множество запросов. Значение по умолчанию обычно адекватно — трогайте его, только если видите проблемы именно со сборкой чанков. Убедитесь также, что во временном каталоге и в каталоге данных хватает места: сборка большого файла из чанков требует свободного пространства под итоговый файл.

Проверяем PHP-FPM и память

Даже с верными лимитами загрузка может падать из-за PHP-FPM: если процессов не хватает, долгая загрузка занимает воркер надолго, а остальным запросам не остаётся ресурсов. И отдельно — память: обработка большого запроса требует достаточного memory_limit.

memory_limit = 512M

В конфиге пула PHP-FPM проверьте число процессов (pm.max_children) — при нехватке под нагрузкой запросы встают в очередь и отваливаются по таймауту. Также стоит помнить про место на диске: заполненное хранилище тихо ломает загрузку любого размера, поэтому следите за df -h. И честно про ресурсы: заливка многогигабайтных файлов десятком пользователей одновременно требует и памяти, и быстрого диска, и нормального канала. На минимальном VPS большие файлы будут грузиться медленно даже при идеальных настройках — под такие задачи берите конфигурацию с запасом по RAM и SSD. После настройки всех звеньев большие файлы начнут проходить стабильно.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.

Арендовать VPS под Nextcloud

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Почему nginx выдаёт 413 при загрузке большого файла?

Сработал лимит client_max_body_size (по умолчанию 1 МБ). Поднимите его в nginx и согласуйте с upload_max_filesize и post_max_size в PHP — фактическим потолком станет наименьшее из трёх значений.

Файл грузится, но обрывается на середине с 504. Что делать?

Это таймаут. Увеличьте согласованно fastcgi_read_timeout и proxy_read_timeout в nginx и max_execution_time в PHP. Загрузка обрывается на самом «нетерпеливом» звене, поэтому лимиты времени нужно поднять везде.

Я поднял лимит в PHP, но большие файлы всё равно не грузятся. Почему?

Скорее всего, узкое место осталось в nginx (client_max_body_size) или post_max_size меньше upload_max_filesize. Действует правило минимума: достаточно одного низкого значения в цепочке, чтобы всё упёрлось в него.

Нужно ли настраивать чанковую загрузку?

Обычно значение по умолчанию адекватно, и трогать max_chunk_size не нужно. Настраивайте его, только если видите проблемы именно со сборкой частей. Главное — чтобы размер чанка укладывался в лимиты размера и таймаута.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.