Nextcloud: медленно работает — причины и решение
Интерфейс грузится секундами, файлы открываются с задержкой, синхронизация еле ползёт — знакомая картина, когда Nextcloud медленно работает. Хорошая новость: почти всегда тормоза лечатся настройкой, а не покупкой мощного железа. Дефолтная установка Nextcloud намеренно консервативна, и несколько правильных шагов — кэш, cron, индексы — ускоряют её в разы. Разберём узкие места по порядку, от самых влиятельных к тонким.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →С чего начать диагностику
Прежде чем крутить настройки, посмотрите, на что жалуется сам Nextcloud. В админке есть раздел «Обзор» с предупреждениями о производительности, а в консоли доступна утилита occ, которая показывает конфигурацию и проблемы.
sudo -u www-data php occ config:list system
sudo -u www-data php occ status
Заодно оцените, где именно теряется время: тормозит интерфейс (значит, PHP и кэш), тормозит листинг файлов (значит, база данных и файловый кэш) или буксует синхронизация (значит, cron и блокировки). Разные симптомы — разные причины, и лечить их надо прицельно. Ниже — набор мер, которые дают наибольший прирост; внедряйте их по очереди, проверяя эффект, а не всё сразу вслепую.
Включаем OPcache для PHP
Nextcloud — это большое PHP-приложение, и без кэша скомпилированного кода PHP заново разбирает тысячи файлов на каждый запрос. OPcache хранит скомпилированный байт-код в памяти и радикально ускоряет отклик. Это первое и самое влиятельное, что нужно сделать.
В конфиге PHP (php.ini или отдельный файл в conf.d) задайте:
opcache.enable=1
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=60
Особенно важны interned_strings_buffer и max_accelerated_files: значения по умолчанию малы для Nextcloud, из-за чего кэш переполняется и работает неэффективно — админка как раз предупреждает об этом. После правки перезапустите PHP-FPM (systemctl restart php8.2-fpm). Уже один этот шаг обычно убирает большую часть «задумчивости» интерфейса. Проверьте, что OPcache активен, в разделе безопасности и настройки админки — предупреждение должно исчезнуть.
Стоит понимать, почему именно OPcache даёт такой эффект. Nextcloud состоит из тысяч PHP-файлов, и на каждый клик пользователя интерпретатор без кэша заново читает их с диска, разбирает синтаксис и компилирует в байт-код — и всё это лишь для того, чтобы выдать одну страницу. OPcache выполняет эту работу один раз и держит результат в памяти, поэтому последующие запросы обходятся почти бесплатно. Именно поэтому первый заход после перезапуска PHP всегда чуть медленнее — кэш ещё холодный, — а дальше отклик резко ускоряется. Не экономьте на memory_consumption: если кэша не хватает на весь код Nextcloud вместе с приложениями, он начинает вытеснять сам себя, и выигрыш теряется.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS под NextcloudНастраиваем кэш памяти: APCu и Redis
По умолчанию Nextcloud не использует кэш в памяти, и каждый мелкий запрос бьёт по диску и базе. Правильная связка — APCu для локального кэша и Redis для распределённых блокировок файлов. Это снимает нагрузку с базы и ускоряет операции с файлами.
Установите Redis и APCu, затем добавьте в config/config.php:
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
],
Подключение Redis через unix-сокет быстрее, чем через TCP на localhost, — используйте его, если Redis на той же машине. memcache.locking через Redis решает частую проблему «file is locked»: без распределённых блокировок Nextcloud использует блокировки в базе, которые медленны и порой зависают. После правки перезапустите PHP-FPM и веб-сервер. Прирост особенно заметен на операциях с множеством мелких файлов.
Меняем AJAX-cron на системный
Nextcloud выполняет фоновые задачи (индексация, уборка, уведомления) через механизм cron. По умолчанию часто стоит режим AJAX — задачи запускаются, когда пользователь открывает страницу. Это и тормозит интерфейс (задачи выполняются в момент вашего клика), и ненадёжно (при простое задачи копятся). Правильно — системный cron каждые 5 минут.
# добавьте в crontab пользователя www-data:
*/5 * * * * php -f /var/www/nextcloud/cron.php
# и переключите режим:
sudo -u www-data php occ background:cron
Теперь тяжёлые фоновые задачи выполняются по расписанию в фоне, а не во время вашего взаимодействия с интерфейсом. Это одновременно ускоряет отклик и оздоравливает систему: накопившиеся задачи наконец разгребаются. Проверьте в админке, что последний запуск cron был недавно — если время «зависло», cron не отрабатывает, и это отдельная проблема, которую надо чинить.
Оптимизируем базу данных
На больших инсталляциях с тысячами файлов узким местом становится база. Nextcloud умеет добавлять недостающие индексы и переводить столбцы в эффективные типы — это заметно ускоряет листинги и поиск. Проверьте и примените рекомендации.
sudo -u www-data php occ db:add-missing-indices
sudo -u www-data php occ db:add-missing-columns
sudo -u www-data php occ db:convert-filecache-bigint
Отдельно — сама СУБД. SQLite годится только для теста; для реальной работы используйте MariaDB или PostgreSQL, они на порядок быстрее под нагрузкой. Если вы всё ещё на SQLite и облако тормозит — это и есть главная причина, переезжайте на MariaDB. Настройте буферы БД под доступную память (innodb_buffer_pool_size для MariaDB), чтобы горячие данные держались в RAM. База в памяти — быстрые листинги и поиск.
Транскодирование, превью и последние штрихи
Часть тормозов создаёт сам контент. Генерация превью для больших изображений и видео на лету нагружает сервер при каждом открытии галереи. Настройте разумные ограничения размеров превью и предгенерацию, чтобы не считать их в момент запроса.
sudo -u www-data php occ config:system:set preview_max_x --value 2048
sudo -u www-data php occ config:system:set preview_max_y --value 2048
Ещё несколько мер: включите HTTP/2 и сжатие на веб-сервере, отдавайте статику с правильными заголовками кэширования, вынесите базу и Redis на быстрый диск. Проверьте, что PHP-FPM настроен на достаточное число воркеров (pm.max_children) под вашу нагрузку — при нехватке процессов запросы встают в очередь. И честно оцените ресурсы сервера: если пользователей десятки и файлов сотни тысяч, минимальный VPS с 1 ГБ RAM физически не потянет, сколько ни настраивай. Nextcloud комфортно живёт на 2–4 ГБ RAM с SSD; для команды берите конфигурацию с запасом.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS под NextcloudОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Что даёт максимальный прирост скорости Nextcloud?
Три вещи по влиятельности: правильно настроенный OPcache для PHP, кэш в памяти (APCu + Redis для блокировок) и переход с AJAX-cron на системный. Эти шаги убирают большую часть тормозов ещё до тонкой оптимизации.
Nextcloud тормозит на листинге файлов. Что делать?
Узкое место — база данных. Выполните occ db:add-missing-indices и убедитесь, что вы на MariaDB или PostgreSQL, а не на SQLite. Настройте буфер БД под доступную память, чтобы горячие данные жили в RAM.
Почему интерфейс подтормаживает при каждом клике?
Скорее всего, включён AJAX-режим cron: фоновые задачи выполняются в момент открытия страницы. Переключитесь на системный cron каждые 5 минут командой occ background:cron — отклик станет ровным.
Поможет ли настройка, если сервер слабый?
До определённого предела. OPcache, кэш и cron ускорят даже скромный VPS, но при десятках пользователей и сотнях тысяч файлов нужна оперативка и SSD. Для команды берите 2–4 ГБ RAM с быстрым диском.
Нужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.