Aller au contenu

16. Optimisation des performances WordPress

Après avoir sécurisé votre installation WordPress, l’étape suivante est l’optimisation de ses performances. Cette section couvre les techniques d’optimisation essentielles qui permettront de :

  1. Réduire l’utilisation des ressources serveur
  2. Améliorer les temps de chargement des pages
  3. Gérer plus de visiteurs simultanés
  4. Améliorer l’expérience utilisateur globale

WordPress enregistre automatiquement des révisions de vos articles et pages au fur et à mesure que vous les modifiez. Bien qu’utile pour la récupération de contenu, des révisions excessives peuvent alourdir votre base de données.

Vous pouvez contrôler les révisions des articles en ajoutant une directive à votre fichier wp-config.php :

# Naviguer vers votre installation WordPress
cd /var/www/example.com/
sudo vim public_html/wp-config.php

Ajoutez l’une de ces lignes à votre configuration :

// Désactiver complètement les révisions des articles
define('WP_POST_REVISIONS', false);
// Ou limiter à un nombre spécifique (recommandé : 3-5)
define('WP_POST_REVISIONS', 3);

Après avoir effectué les modifications, redémarrez PHP-FPM pour vider le opcache :

sudo systemctl restart php8.3-fpm

16.3. Définition de la limite de mémoire maximale

Section intitulée « 16.3. Définition de la limite de mémoire maximale »

WordPress peut être gourmand en mémoire, surtout avec des thèmes et des extensions complexes. Augmenter la limite de mémoire peut prévenir les erreurs “out of memory”.

Commencez par augmenter la limite de mémoire dans la configuration de votre pool PHP-FPM :

# Modifier la configuration du pool PHP-FPM de votre site
sudo vim /etc/php/8.3/fpm/pool.d/example.com.conf

Trouvez et modifiez la ligne de limite de mémoire :

; Augmenter de 32M par défaut à 256M
;php_admin_value[memory_limit] = 32M
php_admin_value[memory_limit] = 256M

Définissez également la limite de mémoire dans WordPress lui-même :

# Modifier votre configuration WordPress
sudo vim /var/www/example.com/public_html/wp-config.php

Ajoutez cette ligne à votre configuration :

/** Memory Limit for WordPress */
define('WP_MEMORY_LIMIT', '256M');

WordPress utilise un système cron virtuel (WP-Cron) qui se déclenche lors du chargement des pages, ce qui peut être inefficace et peu fiable. Le remplacer par une vraie tâche cron système améliore les performances et la fiabilité.

Commencez par désactiver le WP-Cron intégré :

# Modifier votre configuration WordPress
sudo vim /var/www/example.com/public_html/wp-config.php

Ajoutez cette ligne à votre configuration :

/** Désactiver le système cron intégré */
define('DISABLE_WP_CRON', true);

Redémarrez PHP-FPM pour appliquer les modifications :

sudo systemctl restart php8.3-fpm

Maintenant, configurez une tâche cron système pour déclencher les événements cron de WordPress :

# Modifier votre crontab
crontab -e

Ajoutez cette ligne pour exécuter le cron WordPress toutes les 15 minutes :

# Exécuter le cron WordPress toutes les 15 minutes
*/15 * * * * wget -q -O - https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1

La mise en cache est l’un des moyens les plus efficaces pour améliorer les performances de WordPress. Elle réduit les requêtes à la base de données et l’exécution PHP en stockant du contenu pré-généré.

Types de sites WordPress

Pour les besoins de mise en cache, les sites WordPress peuvent être catégorisés comme :

  • Sites statiques : Le contenu change rarement et est identique pour tous les utilisateurs (blogs, sites vitrine)
  • Sites dynamiques : Le contenu change fréquemment ou est personnalisé pour chaque utilisateur (e-commerce, sites avec abonnement)

Il existe plusieurs niveaux de mise en cache qui peuvent être implémentés :

  1. Mise en cache de pages : Stocke des pages HTML complètes
  2. Mise en cache d’objets : Stocke les résultats des requêtes à la base de données
  3. Mise en cache du navigateur : Indique aux navigateurs de stocker les ressources statiques
  4. Mise en cache CDN : Distribue le contenu mis en cache à travers des serveurs mondiaux

PHP OPcache améliore les performances en stockant le bytecode précompilé des scripts en mémoire, éliminant le besoin pour PHP de charger et analyser les scripts à chaque requête.

Modifiez la configuration du pool PHP-FPM de votre site :

# Naviguer vers le répertoire des pools PHP-FPM
cd /etc/php/8.3/fpm/pool.d/
ls
sudo vim example.com.conf

Ajoutez ces paramètres OPcache à votre configuration :

; CONFIGURATION OPCACHE - SERVEUR DE DEVELOPPEMENT
php_admin_flag[opcache.enabled] = 1
php_admin_value[opcache.memory_consumption] = 256
php_admin_value[opcache.interned_strings_buffer] = 32
php_admin_value[opcache.max_accelerated_files] = 20000
php_admin_flag[opcache.validate_timestamps] = 1
php_admin_value[opcache.revalidate_freq] = 2
php_admin_flag[opcache.validate_permission] = 1

Pour les serveurs de production, utilisez plutôt ces paramètres :

; CONFIGURATION OPCACHE - SERVEUR DE PRODUCTION
php_admin_flag[opcache.enabled] = 1
php_admin_value[opcache.memory_consumption] = 256
php_admin_value[opcache.interned_strings_buffer] = 32
php_admin_value[opcache.max_accelerated_files] = 20000
php_admin_flag[opcache.validate_timestamps] = 0
php_admin_flag[opcache.validate_permission] = 1

Appliquez les modifications :

sudo systemctl reload php8.3-fpm

16.6.2. Détermination de la valeur optimale de max_accelerated_files

Section intitulée « 16.6.2. Détermination de la valeur optimale de max_accelerated_files »

Pour déterminer la valeur optimale de max_accelerated_files, comptez les fichiers PHP dans votre installation :

cd /var/www/
sudo find . -type f -print | grep php | wc -l

Définissez max_accelerated_files à au moins 20 % de plus que ce nombre.

16.7. Mise en cache d’un site WordPress “statique”

Section intitulée « 16.7. Mise en cache d’un site WordPress “statique” »

Pour les sites dont le contenu ne change pas fréquemment et est identique pour tous les utilisateurs, vous pouvez implémenter des stratégies de mise en cache agressives. Choisissez l’une des méthodes suivantes en fonction de vos préférences et exigences.

Le cache FastCGI est une solution de mise en cache au niveau serveur intégrée à Nginx. Elle est très efficace et ne nécessite pas d’extensions WordPress.

16.7.1.1. Configuration de Nginx pour le cache FastCGI

Section intitulée « 16.7.1.1. Configuration de Nginx pour le cache FastCGI »

Commencez par modifier la configuration principale de Nginx :

cd /etc/nginx
sudo vim nginx.conf

Ajoutez les directives suivantes au contexte http (juste au-dessus du commentaire “Virtual Host Configs”) :

### CACHE FASTCGI
# Directive fastcgi_cache_path - PATH et NAME doivent être uniques pour chaque site
# Ajoutez un nouveau fastcgi_cache_path pour chaque site avec un nouveau nom keys_zone
fastcgi_cache_path /var/run/SITE levels=1:2 keys_zone=NAME:100m inactive=60m;
# Appliqué à tous les sites
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

16.7.1.2. Création des règles d’exclusion du cache

Section intitulée « 16.7.1.2. Création des règles d’exclusion du cache »

Créez un fichier pour les règles d’exclusion du cache :

cd /etc/nginx/includes/
sudo vim fastcgi_cache_excludes.conf

Ajoutez ces règles pour exclure le contenu dynamique de la mise en cache :

# FICHIER D'INCLUSION DES EXCLUSIONS DU CACHE NGINX
set $skip_cache 0;
# Les requêtes POST et les URL avec une chaîne de requête doivent toujours être transmises à PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Ne pas mettre en cache les URI contenant les segments suivants
if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Ne pas utiliser le cache pour les utilisateurs connectés ou les commentateurs récents
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}

16.7.1.3. Mise à jour de la configuration Nginx de votre site

Section intitulée « 16.7.1.3. Mise à jour de la configuration Nginx de votre site »

Modifiez la configuration Nginx de votre site :

cd /etc/nginx/sites-available
sudo vim example.com.conf

Ajoutez ces lignes à votre bloc serveur :

# Inclure les règles d'exclusion du cache
include /etc/nginx/includes/fastcgi_cache_excludes.conf;
# Ajouter l'en-tête de statut du cache
add_header X-FastCGI-Cache $upstream_cache_status;
# Ajouter ces directives au bloc location PHP
location ~ \.php$ {
# Directives de traitement PHP existantes...
# Directives du cache FastCGI
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
fastcgi_cache NAME;
fastcgi_cache_valid 60m;
}

Ajoutez un bloc location pour purger le cache :

# Ajouter ceci à votre bloc serveur
location ~ /purge(/.*) {
fastcgi_cache_purge NAME "$scheme$request_method$host$1";
}

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx

Testez si la mise en cache fonctionne :

# La première requête devrait afficher MISS
curl -I https://example.com
# La deuxième requête devrait afficher HIT
curl -I https://example.com

Recherchez l’en-tête X-FastCGI-Cache dans la réponse.

16.7.1.6. Suppression du cache FastCGI (si nécessaire)

Section intitulée « 16.7.1.6. Suppression du cache FastCGI (si nécessaire) »

Si vous devez supprimer le cache FastCGI :

cd /etc/nginx/sites-available
sudo vim example.com.conf

Commentez ou supprimez ces lignes :

# Supprimer ou commenter ces lignes
# include /etc/nginx/includes/fastcgi_cache_excludes.conf;
# add_header X-FastCGI-Cache $upstream_cache_status;
# Dans le bloc location PHP, supprimer ou commenter :
# fastcgi_cache_bypass $skip_cache;
# fastcgi_no_cache $skip_cache;
# fastcgi_cache NAME;
# fastcgi_cache_valid 60m;
# Supprimer le bloc location de purge
# location ~ /purge(/.*) {
# fastcgi_cache_purge NAME "$scheme$request_method$host$1";
# }

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl restart php8.3-fpm

WP Super Cache est une extension populaire de mise en cache WordPress qui génère des fichiers HTML statiques à partir de votre contenu WordPress dynamique.

  1. Connectez-vous à votre tableau de bord d’administration WordPress
  2. Allez dans Extensions > Ajouter
  3. Recherchez “WP Super Cache”
  4. Cliquez sur “Installer maintenant” puis “Activer”

16.7.2.2. Configuration de Nginx pour WP Super Cache

Section intitulée « 16.7.2.2. Configuration de Nginx pour WP Super Cache »

Créez un fichier de configuration pour WP Super Cache :

cd /etc/nginx/includes/
sudo vim wp_super_cache_excludes.conf

Ajoutez ces règles :

# Règles d'exclusion du cache NGINX pour WP Super Cache
set $cache_uri $request_uri;
# Les requêtes POST et les URL avec une chaîne de requête doivent toujours être transmises à PHP
if ($request_method = POST) {
set $cache_uri 'null cache';
}
if ($query_string != "") {
set $cache_uri 'null cache';
}
# Ne pas mettre en cache les URI contenant les segments suivants
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $cache_uri 'null cache';
}
# Ne pas utiliser le cache pour les utilisateurs connectés ou les commentateurs récents
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
set $cache_uri 'null cache';
}
# Utiliser le fichier en cache ou le fichier réel s'il existe, sinon transmettre la requête à WordPress
location / {
try_files /wp-content/cache/supercache/$http_host/$cache_uri/index-https.html $uri $uri/ /index.php?$args;
}

Mettez à jour la configuration Nginx de votre site :

cd /etc/nginx/sites-available/
sudo vim example.com.conf

Commentez le bloc location par défaut et incluez la configuration WP Super Cache :

# Commenter le bloc location par défaut
# location / {
# try_files $uri $uri/ /index.php$is_args$args;
# }
# Inclure la configuration WP Super Cache
include /etc/nginx/includes/wp_super_cache_excludes.conf;

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx

16.7.2.3. Configuration de l’extension WP Super Cache

Section intitulée « 16.7.2.3. Configuration de l’extension WP Super Cache »
  1. Allez dans Réglages > WP Super Cache dans votre administration WordPress
  2. Activez la mise en cache en sélectionnant “Caching On”
  3. Sous l’onglet Avancé :
    • Sélectionnez “Use mod_rewrite to serve cache files”
    • Cochez “Compress pages”
    • Cochez “Don’t cache pages for known users”
    • Cochez “Cache rebuild”
  4. Cliquez sur “Update Status”

16.7.2.4. Suppression de WP Super Cache (si nécessaire)

Section intitulée « 16.7.2.4. Suppression de WP Super Cache (si nécessaire) »

Si vous devez supprimer WP Super Cache :

  1. Désactivez et désinstallez l’extension depuis l’administration WordPress

  2. Restaurez votre configuration Nginx :

cd /etc/nginx/sites-available/
sudo vim example.com.conf

Supprimez l’inclusion de WP Super Cache et restaurez le bloc location par défaut :

# Supprimer cette ligne
# include /etc/nginx/includes/wp_super_cache_excludes.conf;
# Décommenter le bloc location par défaut
location / {
try_files $uri $uri/ /index.php$is_args$args;
}

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl reload php8.3-fpm

W3 Total Cache est une extension de mise en cache complète avec des options de configuration étendues pour diverses méthodes de mise en cache.

  1. Connectez-vous à votre tableau de bord d’administration WordPress
  2. Allez dans Extensions > Ajouter
  3. Recherchez “W3 Total Cache”
  4. Cliquez sur “Installer maintenant” puis “Activer”

16.7.3.2. Préparation pour l’intégration Nginx de W3TC

Section intitulée « 16.7.3.2. Préparation pour l’intégration Nginx de W3TC »

Créez un fichier pour que W3TC puisse écrire ses règles Nginx :

cd /var/www/example.com/public_html/
sudo touch nginx.conf
sudo chown username:username nginx.conf
sudo chmod 660 nginx.conf

Ajoutez une directive de sécurité pour empêcher l’accès direct au fichier nginx.conf :

cd /etc/nginx/includes/
sudo vim nginx_security_directives.conf

Ajoutez cette ligne :

location = /nginx.conf { deny all; }

16.7.3.3. Création des règles d’exclusion du cache W3TC

Section intitulée « 16.7.3.3. Création des règles d’exclusion du cache W3TC »

Créez un fichier de configuration pour les exclusions de cache W3TC :

cd /etc/nginx/includes/
sudo vim w3tc_cache_excludes.conf

Ajoutez ces règles :

# ---------------------
# FICHIER D'EXCLUSIONS W3 TOTAL CACHE
# ---------------------
set $cache_uri $request_uri;
# Les requêtes POST et les URL avec une chaîne de requête doivent toujours être transmises à PHP
if ($request_method = POST) {
set $cache_uri 'null cache';
}
if ($query_string != "") {
set $cache_uri 'null cache';
}
# Ne pas mettre en cache les URI contenant les segments suivants
if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
set $cache_uri 'null cache';
}
# Ne pas utiliser le cache pour les utilisateurs connectés ou les commentateurs récents
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
set $cache_uri 'null cache';
}
# Utiliser le fichier en cache ou le fichier réel s'il existe, sinon transmettre la requête à WordPress
location / {
try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?$args;
}

16.7.3.4. Mise à jour de la configuration Nginx de votre site

Section intitulée « 16.7.3.4. Mise à jour de la configuration Nginx de votre site »

Modifiez la configuration Nginx de votre site :

cd /etc/nginx/sites-available/
sudo vim example.com.conf

Commentez le bloc location par défaut et incluez les configurations W3TC :

# Commenter le bloc location par défaut
#location / {
# try_files $uri $uri/ /index.php$is_args$args;
#}
# Inclure les configurations W3TC
include /etc/nginx/includes/w3tc_cache_excludes.conf;
include /var/www/example.com/public_html/nginx.conf;

Installez l’extension PHP Tidy requise par W3TC :

sudo apt update
sudo apt install php8.3-tidy

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl reload php8.3-fpm

16.7.3.5. Configuration de l’extension W3 Total Cache

Section intitulée « 16.7.3.5. Configuration de l’extension W3 Total Cache »
  1. Allez dans Performance > General Settings dans votre administration WordPress
  2. Activez Page Cache et définissez la méthode à “Disk: Enhanced”
  3. Activez Browser Cache
  4. Activez Minify (facultatif)
  5. Sous Performance > Page Cache :
    • Cochez “Cache SSL”
    • Cochez “Don’t cache pages for logged in users”
  6. Enregistrez tous les paramètres

16.7.3.6. Suppression de W3 Total Cache (si nécessaire)

Section intitulée « 16.7.3.6. Suppression de W3 Total Cache (si nécessaire) »

Si vous devez supprimer W3 Total Cache :

  1. Désactivez et désinstallez l’extension depuis l’administration WordPress

  2. Restaurez votre configuration Nginx :

cd /etc/nginx/sites-available/
sudo vim example.com.conf

Supprimez les inclusions W3TC et restaurez le bloc location par défaut :

# Restaurer le bloc location par défaut
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
# Supprimer ces lignes
# include /etc/nginx/includes/w3tc_cache_excludes.conf;
# include /var/www/example.com/public_html/nginx.conf;

Supprimez les fichiers W3TC :

cd /var/www/example.com/public_html/wp-content/
sudo rm -rf cache/ w3tc-config/
cd /var/www/example.com/public_html/
sudo rm nginx.conf

Appliquez les modifications :

sudo systemctl reload php8.3-fpm
sudo systemctl reload nginx

16.8. Création d’un cache d’objets persistant avec Redis

Section intitulée « 16.8. Création d’un cache d’objets persistant avec Redis »

La mise en cache d’objets stocke les résultats des requêtes à la base de données en mémoire, réduisant significativement la charge de la base de données. Redis est un excellent choix pour la mise en cache d’objets grâce à sa rapidité et ses capacités de persistance.

Installez le serveur Redis et l’extension PHP Redis :

sudo apt update
sudo apt install redis-server php8.3-redis

Vérifiez que Redis fonctionne :

sudo systemctl status redis-server

Vérifiez le journal Redis pour les avertissements ou erreurs :

sudo cat /var/log/redis/redis-server.log

16.8.2.1. Correction de l’avertissement de surengagement mémoire

Section intitulée « 16.8.2.1. Correction de l’avertissement de surengagement mémoire »

Si vous voyez cet avertissement dans les journaux Redis :

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.

Corrigez-le en créant un fichier de configuration sysctl :

cd /etc/sysctl.d/
sudo vim 11-redis.conf

Ajoutez cette ligne :

vm.overcommit_memory = 1

Configurez les limites de mémoire Redis :

sudo vim /etc/redis/redis.conf

Trouvez et modifiez ces paramètres :

# Définir la mémoire maximale à utiliser (ajustez selon les ressources de votre serveur)
maxmemory 256mb
# Définir la politique d'éviction (LRU = Least Recently Used)
maxmemory-policy allkeys-lru

Appliquez les modifications :

sudo systemctl restart redis-server

16.8.3. Configuration de WordPress pour la mise en cache d’objets Redis

Section intitulée « 16.8.3. Configuration de WordPress pour la mise en cache d’objets Redis »

16.8.3.1. Installation d’une extension de cache d’objets Redis

Section intitulée « 16.8.3.1. Installation d’une extension de cache d’objets Redis »
  1. Connectez-vous à votre tableau de bord d’administration WordPress
  2. Allez dans Extensions > Ajouter
  3. Recherchez “Redis Object Cache”
  4. Installez et activez l’extension de Till Krüss

16.8.3.2. Ajout de la configuration Redis à WordPress

Section intitulée « 16.8.3.2. Ajout de la configuration Redis à WordPress »

Modifiez votre configuration WordPress :

cd /var/www/example.com/public_html/
sudo vim wp-config.php

Ajoutez ces lignes :

/** Redis Object Cache Settings */
define('WP_CACHE_KEY_SALT', 'example.com');

Si vous utilisez WooCommerce, vous avez besoin d’une configuration spéciale pour empêcher la mise en cache des données de session :

/** EMPECHER LA MISE EN CACHE REDIS DES DONNEES DE SESSION WOO */
define('WP_REDIS_IGNORED_GROUPS', 'wc_session');

Excluez également ces pages de la mise en cache de pages :

  • /cart/
  • /my-account/
  • /checkout/

Et excluez ces cookies de la génération de clés de cache :

  • woocommerce_cart_hash
  • woocommerce_items_in_cart
  • wp_woocommerce_session_
  • woocommerce_recently_viewed
  • store_notice[notice id]
  • _wc_session_

16.9. Mise en cache d’un site WordPress “dynamique”

Section intitulée « 16.9. Mise en cache d’un site WordPress “dynamique” »

Pour les sites avec du contenu personnalisé ou des changements fréquents (e-commerce, sites avec abonnement), vous avez besoin d’une approche de mise en cache différente qui combine la mise en cache de pages avec la mise en cache d’objets.

16.9.1. Introduction à la mise en cache de sites dynamiques

Section intitulée « 16.9.1. Introduction à la mise en cache de sites dynamiques »

Les sites dynamiques nécessitent :

  1. La mise en cache d’objets (Redis) pour réduire la charge de la base de données
  2. Une mise en cache de pages sélective excluant le contenu personnalisé
  3. La mise en cache du navigateur pour les ressources statiques

Cette approche utilise WP Super Cache pour la mise en cache de pages avec des exclusions soigneuses et Redis pour la mise en cache d’objets.

  1. Suivez les étapes d’installation de Redis de la section 16.8
  2. Suivez les étapes d’installation de WP Super Cache de la section 16.7.2
  3. Dans les paramètres WP Super Cache :
    • Activez “Don’t cache pages for known users”
    • Ajoutez des exclusions personnalisées pour les pages dynamiques

Cette approche utilise W3 Total Cache avec Redis comme backend de cache d’objets.

  1. Suivez les étapes d’installation de Redis de la section 16.8
  2. Suivez les étapes d’installation de W3TC de la section 16.7.3
  3. Dans W3TC Performance > General Settings :
    • Définissez la méthode de cache d’objets à “Redis”
    • Configurez l’hôte Redis (généralement “localhost”) et le port (6379)
  4. Dans les paramètres de cache de pages :
    • Activez “Don’t cache pages for logged in users”
    • Ajoutez des exclusions personnalisées pour les pages dynamiques

Une configuration correcte de PHP-FPM est cruciale pour des performances WordPress optimales.

16.10.1. Analyse de l’utilisation des ressources PHP-FPM

Section intitulée « 16.10.1. Analyse de l’utilisation des ressources PHP-FPM »

Commencez par identifier les utilisateurs de vos pools PHP-FPM :

# Afficher tous les noms d'utilisateurs des pools PHP-FPM
grep -E '^\s*user\s*=' /etc/php/8.3/fpm/pool.d/*.conf | awk -F= '{print $2}' | xargs | tr ' ' '\n' | sort -u

Calculez l’utilisation mémoire moyenne par processus PHP-FPM :

# Remplacez POOL_USER par votre nom d'utilisateur de pool réel
ps -C php-fpm --user POOL_USER -o rss= | awk '{ sum += $1; count++ } END { if (count > 0) printf ("%d%s\n", sum/NR/1024,"M") }'

Exemple :

ps -C php-fpm --user wordpress_user -o rss= | awk '{ sum += $1; count++ } END { if (count > 0) printf ("%d%s\n", sum/NR/1024,"M") }'

16.10.2. Configuration du gestionnaire de processus OnDemand

Section intitulée « 16.10.2. Configuration du gestionnaire de processus OnDemand »

Pour la plupart des sites WordPress, le gestionnaire de processus “ondemand” est optimal :

cd /etc/php/8.3/fpm/pool.d/
sudo vim example.com.conf

Mettez à jour les paramètres du gestionnaire de processus :

; Utiliser le gestionnaire de processus ondemand
pm = ondemand
; Définir max_children selon : (RAM totale - RAM réservée) / Taille moyenne du processus
; Exemple : (2048Mo - 512Mo) / 50Mo = 30
pm.max_children = 30
; Terminer les processus inactifs après 10 secondes
pm.process_idle_timeout = 10s
; Redémarrer les processus après avoir traité 500 requêtes
pm.max_requests = 500

Appliquez les modifications :

sudo systemctl reload php8.3-fpm

Vérifiez si vos processus PHP-FPM atteignent les limites :

sudo grep max_children /var/log/php8.3-fpm.log

Si vous voyez cet avertissement, augmentez votre paramètre pm.max_children :

WARNING: [pool www] server reached max_children setting (25), consider raising it

Cloudflare est un réseau de diffusion de contenu (CDN) et un service de sécurité qui peut améliorer significativement les performances et la sécurité de WordPress.

  1. CDN mondial : Sert le contenu mis en cache depuis des centres de données dans le monde entier
  2. Protection DDoS : Atténue les attaques par déni de service distribué
  3. Pare-feu applicatif web : Bloque les vecteurs d’attaque courants
  4. SSL/TLS : Fournit des certificats SSL gratuits et des connexions TLS optimisées
  5. Optimisation d’images : Optimise automatiquement les images pour un chargement plus rapide

Pour garantir une journalisation correcte des adresses IP des visiteurs lors de l’utilisation de Cloudflare, vous devez configurer Nginx pour reconnaître les adresses IP de Cloudflare :

cd /etc/nginx/includes
sudo vim cloudflare_ip_list.conf

Ajoutez les plages IP de Cloudflare :

# Plages IP Cloudflare
# Dernière mise à jour OCT 2022 - Vérifiez https://www.cloudflare.com/ips pour les mises à jour
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;

Incluez ce fichier dans la configuration Nginx de votre site :

cd /etc/nginx/sites-available/
sudo vim example.com.conf

Ajoutez cette ligne à votre bloc serveur :

include /etc/nginx/includes/cloudflare_ip_list.conf;

Appliquez les modifications :

sudo nginx -t
sudo systemctl reload nginx

16.11.3. Paramètres Cloudflare recommandés pour WordPress

Section intitulée « 16.11.3. Paramètres Cloudflare recommandés pour WordPress »

Après vous être inscrit sur Cloudflare et avoir pointé votre domaine vers leurs serveurs de noms :

  1. SSL/TLS : Définissez à “Full” ou “Full (Strict)” si vous avez un certificat SSL valide
  2. Mise en cache :
    • Définissez le niveau de mise en cache à “Standard”
    • Activez “Always Online”
    • Définissez le TTL du cache navigateur à au moins 4 heures
  3. Vitesse :
    • Activez Auto Minify pour HTML, CSS et JavaScript
    • Activez la compression Brotli
    • Activez Early Hints
    • Activez Rocket Loader pour JavaScript
  4. Règles de page :
    • Créez une règle pour contourner le cache pour /wp-admin/*
    • Créez une règle pour contourner le cache pour les pages de connexion et de paiement

L’optimisation des performances WordPress est une approche multicouche qui implique :

  1. Optimisations au niveau serveur : Réglage de PHP-FPM, configuration d’OPcache
  2. Configuration WordPress : Révisions des articles, limites de mémoire, WP-Cron
  3. Stratégies de mise en cache : Mise en cache de pages, mise en cache d’objets, mise en cache du navigateur
  4. Diffusion de contenu : Intégration CDN avec Cloudflare

N’oubliez pas que l’optimisation des performances est un processus continu. Surveillez régulièrement les performances de votre site avec des outils tels que :

  • Google PageSpeed Insights
  • GTmetrix
  • WebPageTest

Ajustez votre stratégie d’optimisation en fonction des besoins spécifiques de votre site WordPress et de vos schémas de trafic.