Tune a Nextcloud Instance
Move to Nextcloud - Tuning
Project Link: Nextcloud
Tune your Nextcloud instance
PHP memory limit
Nextcloud is recommending a memory limit of at least 512 MB or more. Therefore please edit your php.ini
. Depending on the PHP version, operating system and the web server you using the location of the file differs. With Apache2 + PHP 8.0 at Ubuntu bases OS you find it here: /etc/php/8.0/apache2/php.ini
. Open it with your favorite editor and search for the parameter memory_limit
and change it to 512M or higher.
# Before editing
grep memory_limit /etc/php/8.0/apache2/php.ini
memory_limit = 128M
# edit the file with for example vim
sudo vim /etc/php/8.0/apache2/php.ini
# After editing
grep memory_limit /etc/php/8.0/apache2/php.ini
memory_limit = 512M
# restart web server
sudo systemctl restart apache2
PHP-FPM tuning
If PHP-FPM instead of PHP is used (e.g. for HTTP/2), then there are some configurations that should be adapt. Regarding Nextcloud to find the optimal configurations this site can b used. This site of c-rieger is also interesting. Please adapt the settings to your needs, one example.
sudo su
AvailableRAM=$(awk '/MemAvailable/ {printf "%d", $2/1024}' /proc/meminfo)
AverageFPM=$(ps --no-headers -o 'rss,cmd' -C php-fpm8.0 | awk '{ sum+=$1 } END { printf ("%d\n", sum/NR/1024,"M") }')
FPMS=$((AvailableRAM/AverageFPM))
PMaxSS=$((FPMS*2/3))
PMinSS=$((PMaxSS/2))
PStartS=$(((PMaxSS+PMinSS)/2))
cp /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
cp /etc/php/8.0/apache2/php.ini /etc/php/8.0/apache2/php.ini.bak
cp /etc/php/8.0/fpm/php.ini /etc/php/8.0/fpm/php.ini.bak
cp /etc/php/8.0/fpm/php-fpm.conf /etc/php/8.0/fpm/php-fpm.conf.bak
sed -i 's/pm.max_children =.*/pm.max_children = '$FPMS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = '$PStartS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = '$PMinSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = '$PMaxSS'/' /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 2000/" /etc/php/8.0/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/apache2/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/apache2/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/apache2/php.ini
sed -i "s/post_max_size =.*/post_max_size = 16G/" /etc/php/8.0/apache2/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 16G/" /etc/php/8.0/apache2/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.0/apache2/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1024M/" /etc/php/8.0/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = 'Off'/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.0/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 16G/" /etc/php/8.0/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 16G/" /etc/php/8.0/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.0/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=128/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=8/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=10000/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=2/" /etc/php/8.0/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.0/fpm/php.ini
sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.0/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.0/fpm/php-fpm.conf
systemctl restart php8.0-fpm
Memory cache - Redis
There are some ways to use memory caching in Nextcloud.
You can significantly improve your Nextcloud server performance with memory caching, where frequently-requested objects are stored in memory for faster retrieval.
I will use redis here. At first edit the redis.conf
file. Afterwards add the needed parameter to the config.php
of Nextcloud. The config.php
is THE file were Nextcloud stores it configuration parameters, so please handle with care.
At first open the /etc/redis/redis.conf
file and edit/adapt the following parameter.
....
bind 127.0.0.1 ::1
....
protected-mode yes
....
port 6379
....
unixsocket /var/run/redis/redis-server.sock
....
requirepass YourSecretPasswordHere
....
# All other settings should be fine
Add the web server user to the redis group and restart redis.
Edit the /var/www/html/nextcloud/config/config.php
and add the needed parameter for redis.
'memcache.local' => '\\OC\\Memcache\\Redis',
'memcache.distributed' => '\\OC\\Memcache\\Redis',
'filelocking.enabled' => true,
'memcache.locking' => '\\OC\\Memcache\\Redis',
'redis' =>
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'dbindex' => 0,
'password' => 'YourSecretPasswordHere',
'timeout' => 1.5,
),
Restart the web server and enable redis so it is started automatically after reboot.
Default Phone region
Nextcloud is complaining about the missing "default_phone_region" in the settings after a fresh installation. Check the ISO 3166-1 Wiki page and choose your code depending on your country (in my case DE
) and add it to the config.php
.
auto logout
This is optional, but i think it is needed. If one is logged in to your Nextcloud instance, but there is no activity anymore, Nextcloud is able to logout the user automatically. To configure a logout after 15 minutes, add the following lines to the config.php
.
....
# auto logout enabled
'auto_logout' => true,
# Enable or disable session keep-alive when a user is logged in to the Web UI.
'session_keepalive' => true,
# The lifetime of a session after inactivity.
'session_lifetime' => 900, # --> in Seconds. Also possible value: 60*15
# Optional: Lifetime of the remember login cookie, which is set when the user clicks the remember checkbox on the login screen.
# Seems to be used by the DEsktop client too
'remember_login_cookie_lifetime' => 60*60*24*15, # --> default's to 15 days. If it is set to 0 remember function is disabled.
....
mysqltuner
In order to increase performance and stability of the database one could use mysqltuner. Installation and using is really easy.
sudo apt install mysqltuner
sudo mysqltuner
>> MySQLTuner 1.7.13 - Major Hayden <[email protected]>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
....
-------- Recommendations ---------------------------------------------------------------------------
General recommendations:
Control warning line(s) into /var/log/mysql/error.log file
....
The recommendations can be added to the server.cnf of the mysql installation. In Ubuntu for example /etc/mysql/mariadb.conf.d/50-server.cnf
. Additionally add the following to the config as per Nextcloud admin guide.
- “READ COMMITED” transaction isolation level
- Disabled or BINLOG_FORMAT = ROW configured Binary Logging
See also Nextcloud database sample configuration.