Eine langsame Nextcloud frustriert Nutzer. Mit den richtigen Optimierungen läuft Ihre private Cloud deutlich schneller. Dieser Artikel zeigt die wichtigsten Tuning-Maßnahmen.

Performance-Analyse

Aktuelle Performance prüfen

# Admin-Einstellungen prüfen
# https://ihre-nextcloud.de/settings/admin/overview

# Grundlegende System-Informationen
cat /var/www/nextcloud/config/config.php

Häufige Probleme

Typische Ursachen für langsame Nextcloud:
- Kein Memory-Caching (Redis/APCu)
- PHP-OPcache nicht aktiviert
- Datenbank nicht optimiert
- Synchronisation großer Dateien
- Fehlende Indizes in Datenbank

PHP-OPcache aktivieren

OPcache Konfiguration

# /etc/php/8.2/fpm/conf.d/10-opcache.ini

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

PHP-FPM Tuning

# /etc/php/8.2/fpm/pool.d/www.conf

; Prozess-Management
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500

; Speicher pro Prozess
php_admin_value[memory_limit] = 512M
php_admin_value[upload_max_filesize] = 10G
php_admin_value[post_max_size] = 10G

PHP-FPM neu starten

systemctl restart php8.2-fpm

Redis-Caching einrichten

Redis installieren

apt install redis-server php-redis

Redis konfigurieren

# /etc/redis/redis.conf

# Socket-Verbindung (schneller)
unixsocket /var/run/redis/redis-server.sock
unixsocketperm 770

# Speicher begrenzen
maxmemory 512mb
maxmemory-policy allkeys-lru

# Persistenz (optional deaktivieren für reinen Cache)
save ""

Redis-Benutzer

usermod -a -G redis www-data
systemctl restart redis-server

Nextcloud für Redis konfigurieren

// /var/www/nextcloud/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,
    'timeout' => 0.0,
],

APCu für lokalen Cache

# /etc/php/8.2/fpm/conf.d/20-apcu.ini
apc.shm_size=128M
apc.enable_cli=1

Datenbank optimieren

MySQL/MariaDB Tuning

# /etc/mysql/mariadb.conf.d/99-nextcloud.cnf

[mysqld]
innodb_buffer_pool_size = 1G
innodb_buffer_pool_instances = 1
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# Query-Cache (für MariaDB)
query_cache_type = 1
query_cache_size = 64M
query_cache_limit = 2M

# Verbindungen
max_connections = 200
wait_timeout = 600

# Performance
tmp_table_size = 64M
max_heap_table_size = 64M

Fehlende Indizes hinzufügen

# Als www-data ausführen
sudo -u www-data php /var/www/nextcloud/occ db:add-missing-indices

Datenbank-Wartung

# Tabellen optimieren
sudo -u www-data php /var/www/nextcloud/occ db:convert-filecache-bigint

# Datenbank reparieren
mysqlcheck -u root -p --optimize nextcloud

PostgreSQL Alternative

-- postgresql.conf Tuning
shared_buffers = 256MB
effective_cache_size = 1GB
maintenance_work_mem = 128MB
work_mem = 16MB

Nginx-Optimierung

Nginx Konfiguration

# /etc/nginx/sites-available/nextcloud

upstream php-handler {
    server unix:/var/run/php/php8.2-fpm.sock;
}

server {
    listen 443 ssl http2;
    server_name cloud.example.com;

    root /var/www/nextcloud;

    # Gzip-Kompression
    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
    gzip_types application/javascript application/json text/css text/plain;

    # Client-Body-Größe
    client_max_body_size 10G;
    client_body_timeout 300s;
    fastcgi_buffers 64 4K;

    # Statische Dateien cachen
    location ~* \.(?:css|js|woff2?|svg|gif|png|jpg|ico)$ {
        expires 6M;
        add_header Cache-Control "public, immutable";
    }

    location ~ \.php(?:$|/) {
        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass php-handler;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
        fastcgi_read_timeout 300;
    }
}

Cron-Jobs optimieren

Webcron zu System-Cron

# Crontab für www-data
crontab -u www-data -e

# Alle 5 Minuten (statt Webcron)
*/5 * * * * php -f /var/www/nextcloud/cron.php

In config.php aktivieren

'backgroundjobs_mode' => 'cron',

Systemd-Timer Alternative

# /etc/systemd/system/nextcloudcron.service
[Unit]
Description=Nextcloud cron.php job

[Service]
User=www-data
ExecStart=/usr/bin/php -f /var/www/nextcloud/cron.php
KillMode=process
# /etc/systemd/system/nextcloudcron.timer
[Unit]
Description=Run Nextcloud cron.php every 5 minutes

[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=nextcloudcron.service

[Install]
WantedBy=timers.target
systemctl enable --now nextcloudcron.timer

Vorschaubilder optimieren

Preview-Generator App

# App installieren
sudo -u www-data php occ app:install previewgenerator

# Konfiguration
sudo -u www-data php occ config:app:set previewgenerator squareSizes --value="32 256"
sudo -u www-data php occ config:app:set previewgenerator widthSizes --value="256 384"
sudo -u www-data php occ config:app:set previewgenerator heightSizes --value="256"

# Vorschau generieren
sudo -u www-data php occ preview:generate-all

Preview-Einstellungen

// config.php
'enable_previews' => true,
'preview_max_x' => 2048,
'preview_max_y' => 2048,
'preview_max_filesize_image' => 50,
'enabledPreviewProviders' => [
    'OC\Preview\PNG',
    'OC\Preview\JPEG',
    'OC\Preview\GIF',
    'OC\Preview\HEIC',
    'OC\Preview\Movie',
    'OC\Preview\PDF',
],

Cron für Preview-Generator

# Crontab
*/10 * * * * sudo -u www-data php /var/www/nextcloud/occ preview:pre-generate

Dateisystem optimieren

Dateiverzeichnis auf SSD

# Datenverzeichnis verschieben
systemctl stop apache2
mv /var/www/nextcloud/data /mnt/ssd/nextcloud-data
// config.php
'datadirectory' => '/mnt/ssd/nextcloud-data',

Dateisystem-Optionen

# /etc/fstab - noatime reduziert Schreibzugriffe
/dev/sda1 /mnt/ssd ext4 defaults,noatime 0 2

Große Dateien auslagern

# Externe Storage-App für große Dateien
sudo -u www-data php occ app:enable files_external

Netzwerk-Optimierung

HTTP/2 aktivieren

listen 443 ssl http2;

Keep-Alive

keepalive_timeout 65;
keepalive_requests 100;

Performance-Monitoring

Nextcloud-Logs analysieren

# Slow-Queries finden
tail -f /var/www/nextcloud/data/nextcloud.log | grep -i slow

MySQL Slow-Query-Log

# /etc/mysql/mariadb.conf.d/99-nextcloud.cnf
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

PHP-FPM Status

# In Nginx-Config
location ~ ^/status$ {
    include fastcgi_params;
    fastcgi_pass php-handler;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    allow 127.0.0.1;
    deny all;
}
# PHP-FPM Pool
pm.status_path = /status

Benchmarks

Vorher/Nachher Vergleich

| Aktion | Ohne Tuning | Mit Tuning | |--------|-------------|------------| | Dashboard laden | 3.5s | 0.8s | | Ordner öffnen | 2.0s | 0.4s | | Datei-Upload 100MB | 45s | 20s | | Suche | 5.0s | 1.2s |

Typische Verbesserungen

Redis-Caching: 40-60% schneller
OPcache: 20-30% schneller
DB-Optimierung: 30-50% schneller
Preview-Generator: Sofortige Vorschau

Checkliste

□ PHP-OPcache aktiviert und konfiguriert
□ Redis oder Memcached für Caching
□ APCu für lokalen Cache
□ Datenbank-Indizes hinzugefügt
□ MySQL/MariaDB InnoDB-Tuning
□ System-Cron statt Webcron
□ Preview-Generator installiert
□ Nginx/Apache optimiert
□ HTTP/2 aktiviert
□ Datenverzeichnis auf SSD
□ PHP-FPM Pool-Größe angepasst

Fazit

Nextcloud-Performance hängt von vielen Faktoren ab. Redis-Caching, OPcache und Datenbank-Tuning bringen die größten Verbesserungen. Investieren Sie in eine SSD für das Datenverzeichnis und nutzen Sie den Preview-Generator für schnellere Bildvorschauen. Mit diesen Optimierungen läuft Ihre Nextcloud spürbar schneller.