Производительность Nextcloud на скромном сервере

2 мин чтения

Жалобы на медленный Nextcloud чаще всего связаны не с самим продуктом, а с настройками по умолчанию. На домашнем сервере даже несколько простых изменений заметно ускоряют интерфейс. Менять всё сразу не стоит: вносите правки по одной и сравнивайте результат.

Cron вместо AJAX

Фоновые задачи по умолчанию запускаются при открытии страниц, а это медленно и ненадёжно. Переключитесь на системный cron с интервалом в пять минут:

sudo -u www-data php occ background:cron
# в crontab пользователя www-data:
*/5 * * * * php -f /var/www/nextcloud/cron.php

OPcache

PHP без OPcache компилирует скрипты снова и снова. Включите его и выделите достаточно памяти. Обычно хватает примерно таких значений:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000

Если в разделе «Обзор» появилось предупреждение о нехватке буфера, увеличьте соответствующий параметр. На сервере с малым объёмом памяти начните со 128 МБ.

Redis для кэша и блокировок

APCu хорошо подходит для локального кэша, а Redis — для распределённого кэша и файловых блокировок. Без него блокировки хранятся в базе данных и создают лишнюю нагрузку.

'memcache.local' => '\\OC\\Memcache\\APCu',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' => ['host' => '127.0.0.1', 'port' => 6379],

Не забудьте, что для cron и occ APCu должен быть включён в CLI: задайте apc.enable_cli=1.

PHP-FPM

Значения по умолчанию рассчитаны на минимальную нагрузку. Настройте pm.max_children, исходя из свободной памяти и среднего размера процесса PHP. Например, если один процесс занимает около 100 МБ, а под PHP можно отдать 1 ГБ, ставьте не больше десяти. Слишком большое значение приведёт к использованию swap, и всё станет работать ещё медленнее. Для редко используемого домашнего сервера удобен режим pm = ondemand: он освобождает память в простое.

Превью

Миниатюры быстро занимают место и нагружают процессор при просмотре галереи. Ограничьте их максимальный размер параметрами preview_max_x и preview_max_y и отключите форматы, которые вам не нужны. Приложение Preview Generator создаёт превью заранее, по расписанию, поэтому галерея открывается быстрее.

PostgreSQL

SQLite подходит только для тестов. Для постоянной работы возьмите PostgreSQL или MariaDB. В PostgreSQL настройте shared_buffers примерно на четверть выделенной памяти и effective_cache_size на половину или больше. Обязательно храните базу на SSD. Именно медленный диск под базой чаще всего делает интерфейс тяжёлым, и никакой кэш это полностью не компенсирует.

Как измерять

Смотрите журнал медленных запросов, используйте htop и iostat и замеряйте время загрузки страниц до и после изменений. Узкое место бывает разным: на одном сервере это диск, на другом память. Сначала найдите его, а потом уже тратьте время на настройку.