Document : Optimiser Nextcloud grâce aux systèmes de cache

Optimiser Nextcloud grâce aux systèmes de cache

  • admin
  • Debian, Nextcloud, Raspberry Pi

Les ressources du Raspberry Pi restent limitées face aux exigences d'une solution cloud. L'intégration des systèmes de cache (OPcache, APCu et Redis) soulage efficacement le processeur et accélère drastiquement les temps de chargement de Nextcloud grâce au stockage en mémoire vive.

Comprendre les différents niveaux de cache

Avant de modifier nos fichiers de configuration, il est important de comprendre que Nextcloud tire parti de trois systèmes distincts pour soulager votre serveur :

  • Le cache de code (OPcache) : Intégré à PHP, il conserve les scripts précompilés en mémoire. Sans lui, le serveur recompile le code de l'application à chaque requête, ce qui sature inutilement le processeur.

  • Le cache de données local (APCu) : Il stocke en mémoire vive les résultats des requêtes récurrentes, comme l'arborescence de vos dossiers. Son action réduit drastiquement les accès permanents à la base de données.

  • Le cache distribué et de verrouillage (Redis) : Bien qu'il s'agisse d'un système de mise en cache distribuée, son rôle principal ici est de gérer le verrouillage transactionnel des fichiers (file locking). Lorsqu'un document est en cours de synchronisation, Nextcloud le verrouille pour éviter les conflits. Redis traite ces verrous en mémoire vive de manière très efficace. Son intervention préserve ainsi la base de données des opérations intensives.

Nous allons installer et configurer ces composants étape par étape, afin d'optimiser les performances globales et de faire disparaître les avertissements de votre tableau de bord.

Ajustement des paramètres OPcache

Sur Raspberry Pi OS (basé sur Debian), la configuration des modules PHP est gérée dans des fichiers séparés. Plutôt que de modifier la configuration globale, nous allons surcharger les paramètres d'OPcache directement dans son fichier dédié.

L'objectif principal consiste à augmenter le tampon alloué aux chaînes de caractères (interned strings) pour faire disparaître les avertissements de performance sur votre interface d'administration.

Ouvrez le fichier de configuration du module OPcache (adaptez la version le PHP selon votre système) :

# Édite la configuration spécifique du module OPcache
sudo nano /etc/php/8.4/mods-available/opcache.ini

À la fin du fichier, ajoutez ces paramètres recommandés par Nextcloud :

# Augmente le tampon des chaînes de caractères (8 par défaut, insuffisant pour Nextcloud)
opcache.interned_strings_buffer=32

# Active le cache pour les commandes terminal (accélère l'utilitaire 'occ' et le cron)
opcache.enable_cli=1

Enregistrez le fichier (Ctrl+O, Entrée, puis Ctrl+X).

Pour que PHP prenne en compte ces nouveaux paramètres, redémarrez votre serveur web :

# Redémarre le service Apache pour appliquer la nouvelle configuration
sudo systemctl restart apache2

Installation du cache de données local (APCu)

APCu est un module PHP spécialisé dans le stockage en mémoire vive des résultats des requêtes courantes. Son utilisation accélère considérablement l'affichage de l'interface de Nextcloud. Contrairement à OPcache, il n'est généralement pas installé par défaut.

Installez le module avec la commande suivante :

# Installe le module APCu pour PHP
sudo apt install php-apcu

Configuration du module APCu

Tout comme pour OPcache, nous allons vérifier la configuration d'APCu dans son fichier de module dédié. L'objectif est de s'assurer de son activation pour les tâches en ligne de commande. Cette manipulation est requise pour le bon fonctionnement de la tâche cron de Nextcloud.

Ouvrez le fichier de configuration :

# Édite la configuration spécifique du module APCu
sudo nano /etc/php/8.4/mods-available/apcu.ini

À la fin du fichier, ajoutez la ligne suivante :

# Active APCu pour l'interface en ligne de commande
apc.enable_cli=1

Enregistrez les modifications (Ctrl+O, Entrée, puis Ctrl+X).

Activation d'APCu dans Nextcloud

L'installation du module ne suffit pas. Il faut maintenant informer Nextcloud qu'il possède l'autorisation de l'utiliser. Cette étape s'effectue dans le fichier de configuration principal de votre instance.

Ouvrez le fichier config.php de Nextcloud :

# Édite le fichier de configuration principal de Nextcloud
sudo nano /var/www/nextcloud/config/config.php

Ajoutez la ligne suivante juste avant la dernière parenthèse fermante ); :

'memcache.local' => '\OC\Memcache\APCu',

Enregistrez (Ctrl+O, Entrée, puis Ctrl+X) et redémarrez votre serveur web pour appliquer l'ensemble des modifications :

# Redémarre Apache pour charger le nouveau module PHP
sudo systemctl restart apache2

Mise en place du cache distribué (Redis)

Pour gérer efficacement le verrouillage transactionnel des fichiers (file locking), Nextcloud recommande vivement l'utilisation de Redis. Contrairement à OPcache et APCu qui sont de simples modules PHP, Redis est un véritable service tournant en arrière-plan sur votre Raspberry Pi.

Installez le serveur Redis ainsi que le module permettant à PHP de communiquer avec lui :

# Installe le serveur Redis et son module PHP
sudo apt install redis-server php-redis

Configuration du service Redis

Puisque Redis et Nextcloud s'exécutent sur la même machine, nous allons configurer une communication directe via un socket Unix plutôt qu'un port réseau interne. Cette méthode supprime toute la latence liée au protocole TCP/IP et assure une sécurité optimale grâce aux permissions strictes du système de fichiers Linux.

Ouvrez le fichier de configuration de Redis :

# Édite la configuration du serveur Redis
sudo nano /etc/redis/redis.conf

Recherchez (via Ctrl+W) et décommentez (en retirant le #) ou modifiez les lignes suivantes :

# Port réseau : mettez-le à 0 pour désactiver l'écoute TCP
port 0

# Chemin vers le fichier socket Unix
unixsocket /run/redis/redis-server.sock

# Droits d'accès au socket
unixsocketperm 770

Enregistrez puis quittez (Ctrl+O, Entrée, puis Ctrl+X).

Pour que le serveur web (www-data) puisse accéder à ce socket, il doit faire partie du groupe d'utilisateurs redis :

# Ajoute l'utilisateur www-data au groupe redis
sudo usermod -a -G redis www-data

Redémarrez ensuite le service Redis pour appliquer la configuration :

# Redémarre le service Redis
sudo systemctl restart redis-server

Activation de Redis dans Nextcloud

La dernière étape consiste à configurer Nextcloud pour qu'il délègue la gestion des verrous de fichiers et la gestion distribuée au service Redis.

Ouvrez le fichier de configuration de Nextcloud :

# Édite le fichier de configuration principal de Nextcloud
sudo nano /var/www/nextcloud/config/config.php

Repérez la ligne 'memcache.local' => '\OC\Memcache\APCu', ajoutée précédemment, puis ajoutez le bloc suivant juste en dessous :

'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'redis' => [
  'host' => '/run/redis/redis-server.sock',
  'port' => 0,
  'timeout' => 0.0,
],

Enregistrez les modifications (Ctrl+O, Entrée, puis Ctrl+X) et redémarrez Apache une ultime fois :

# Redémarre Apache pour charger le module php-redis
sudo systemctl restart apache2

Vérification du fonctionnement de Redis

Maintenant que la configuration est en place, il est judicieux de s'assurer que Nextcloud communique bien avec Redis en arrière-plan.

La première méthode consiste à tester la réponse du service via notre socket Unix :

# Envoie une requête de test au serveur Redis via le socket
sudo redis-cli -s /run/redis/redis-server.sock ping

Si le service est actif et accessible, le serveur doit vous répondre la chaîne de caractères PONG.

Pour aller plus loin et observer la communication en direct, l'outil en ligne de commande de Redis propose un mode de surveillance très pratique :

# Surveille l'activité de Redis en temps réel
sudo redis-cli -s /run/redis/redis-server.sock monitor

Naviguez ensuite dans votre interface Nextcloud depuis un navigateur. Vous verrez défiler en temps réel les requêtes traitées par Redis sur le terminal. Quittez enfin la surveillance avec le raccourci Ctrl+C.

Configuration terminée

Votre instance Nextcloud bénéficie désormais d'une gestion des caches optimale. APCu s'occupe de la mémoire locale, tandis que Redis gère les verrous de fichiers via un socket Unix à faible latence.