This is an old revision of the document!
Nextcloud™
Optimized PHP Configuration
Key PHP Settings
PHP settings are typically found in php.ini
— /etc/php/8.x/fpm/php.ini
memory_limit = 512M ; Minimum recommended by Nextcloud; increase to 1G+ for heavy usage or large files. upload_max_filesize = 2G ; Set to match your largest expected file size (e.g., 2G for 2 GB). post_max_size = 2G ; Should match or exceed upload_max_filesize. max_execution_time = 300 ; Increase for long-running tasks like file uploads or cron jobs (300 seconds = 5 minutes). date.timezone = America/New_York ; Set to your server's timezone to avoid warnings. output_buffering = Off ; Nextcloud recommends disabling this to avoid issues with certain operations.
OPcache Settings (Performance Boost)
OPcache caches precompiled PHP bytecode, significantly speeding up Nextcloud. Add these to php.ini or a separate file like /etc/php/8.x/fpm/conf.d/10-opcache.ini
opcache.enable = 1 ; Enable OPcache. opcache.memory_consumption = 128 ; Memory for cached scripts (128 MB is a good starting point; increase to 256 MB if RAM allows). opcache.interned_strings_buffer = 8 ; Memory for string interning (8 MB is sufficient for most cases). opcache.max_accelerated_files = 10000 ; Max number of files to cache; adjust based on Nextcloud’s file count. opcache.revalidate_freq = 60 ; How often to check for file changes (60 seconds balances performance and freshness). opcache.save_comments = 1 ; Required by Nextcloud to preserve code comments in bytecode. opcache.enable_cli = 0 ; Disable for CLI to avoid unnecessary overhead in cron jobs.
Optional: JIT (PHP 8.0+)
For CPU-intensive tasks (e.g., image processing), enable the JIT compiler:
opcache.jit_buffer_size = 100M opcache.jit = tracing ; "tracing" mode offers the best performance for web apps like Nextcloud.
Enable JIT in Opcache
Edit /etc/php/8.x/fpm/conf.d/10-opcache.ini
; configuration for php opcache module ; priority=10 zend_extension=opcache.so opcache.enable_cli=1 opcache.jit_buffer_size=100M opcache.jit=tracing
Check JIT is enabled
sudo php -i | grep -q 'opcache.jit_buffer_size => [^0]' && echo "JIT is enabled" || echo "JIT is disabled"
Optimized PHP-FPM Configuration
PHP-FPM settings are typically in a pool configuration file like /etc/php/8.1/fpm/pool.d/www.conf
. The default settings are often too conservative for Nextcloud, leading to slow response times or errors under load.
Process Manager Settings
pm = dynamic ; "dynamic" adjusts the number of child processes based on load; use "static" for dedicated servers with predictable traffic. pm.max_children = 120 ; Max number of child processes; calculate as (Total RAM - 1G for OS/other services) / 50-100 MB per process. ; Example: 4 GB RAM → ~60-80 children; 8 GB RAM → ~120-150 children. pm.start_servers = 12 ; Initial processes; set to ~10-20% of max_children. pm.min_spare_servers = 6 ; Minimum idle processes; set to ~5-10% of max_children. pm.max_spare_servers = 18 ; Maximum idle processes; set to ~15-25% of max_children. pm.max_requests = 500 ; Restart child processes after this many requests to prevent memory leaks.
Tuning Tips
- Memory Usage: Each PHP-FPM process may use 50-100 MB of RAM, depending on loaded extensions and workload. Monitor with
htop
orps
and adjustmax_children
to avoid swapping.
- CPU Cores: Ensure
start_servers
+min_spare_servers
doesn’t exceed your CPU core count to avoid contention.
- Static vs. Dynamic: Use
pm = static
withmax_children
set to a fixed number (e.g., 20-40) if your server is dedicated to Nextcloud and traffic is consistent.
Additional PHP-FPM Settings
request_terminate_timeout = 300 ; Match max_execution_time to handle long uploads gracefully. process.priority = -19 ; Optional: Boost priority (requires root and SYS_NICE capability).
Nextcloud-Specific Tweaks
- Memory Caching: Use Redis for local and file-locking caches to reduce database load. Edit
/var/www/nextcloud/config/config.php
:
'memcache.local' => '\OC\Memcache\Redis', 'memcache.locking' => '\OC\Memcache\Redis', 'redis' => [ 'host' => 'localhost', 'port' => 6379, ],
Install Redis (sudo apt install redis-server on Debian) and ensure it’s running.
- Cron Jobs: Use a system cron job instead of AJAX for background tasks. Add to
/etc/crontab
:
*/5 * * * * www-data php -f /var/www/nextcloud/cron.php
- Database: Use MySQL/MariaDB with InnoDB, and tune its configuration (e.g.,
innodb_buffer_pool_size = 1G
for 4 GB RAM).
Solved Problems
mjs configuration error
Error description
Your webserver does not serve `.mjs` files using the JavaScript MIME type. This will break some apps by preventing browsers from executing the JavaScript files. You should configure your webserver to serve `.mjs` files with either the `text/javascript` or `application/javascript` MIME type.
Solution
Edit /etc/nginx/mime.types
application/javascript js mjs;
Remove configuration in nginx conf
# include mime.types; # types { # text/javascript js mjs; # }