...

Cache FastCGI NGINX : accélérer WordPress

J'accélère sensiblement WordPress en utilisant le Cache NGINX au niveau du serveur et renvoie directement des réponses HTML. Cela réduit considérablement le TTFB, PHP-FPM reste disponible et la base de données traite moins de Requêtes.

Points centraux

  • Côté serveur Au lieu d'un plugin : FastCGI Cache allège la charge de PHP et réduit la latence.
  • Purge En cas de modifications : les contenus restent à jour et sont mis à jour de manière ciblée.
  • Exclusions Les zones dynamiques telles que la connexion, le panier et le paiement restent dynamiques.
  • Mise à l'échelle sous charge : les caches sont consultés plus fréquemment et réduisent la charge du serveur.
  • Mesurable plus rapide : les valeurs TTFB, RPS et CPU s'améliorent nettement.

Comment le cache FastCGI de NGINX accélère WordPress

Lors de la première requête, WordPress génère la page, puis NGINX stocke la réponse finale sous forme de HTML et traite les requêtes identiques suivantes sans passer par PHP-FPM. Je réduis ainsi le temps CPU et les changements de contexte, tandis que le système de fichiers ou le cache du système d'exploitation assure un traitement rapide Résultats fournit. Même en cas de pics de trafic, le temps de réponse reste faible, car aucun processus PHP ne doit être lancé. Je minimise ainsi le TTFB et permets un plus grand nombre de requêtes par seconde. Il en résulte une interaction plus fluide, moins de délais d'attente et une réserve de performances évidente pour les véritables processus dynamiques.

Cache côté serveur vs cache via un plugin (avec comparaison)

Un plugin de mise en cache fonctionne dans le Pile PHP et déclenche souvent des processus, même en cas de résultats positifs, tandis que FastCGI Cache répond directement au niveau du serveur web. Cela permet d'éliminer de nombreuses charges supplémentaires, telles que l'initialisation de PHP et les hooks de plugins. Pour les visiteurs réguliers, je privilégie surtout l’approche côté serveur et je la combine, si nécessaire, avec un plugin d’optimisation front-end léger. Si vous souhaitez examiner les détails en profondeur, commencez par une version allégée Phase de test et mesure séparément le TTFB, l'utilisation du processeur et le taux de réussite du cache. Les différences apparaissent très rapidement, notamment en condition de charge.

Critère Cache des plugins (PHP) Cache FastCGI de NGINX
Mode de réponse PHP est initialisé, le plugin vérifie le cache Le serveur web fournit directement le fichier
TTFB plus élevé en raison du démarrage de PHP très faible en cas de réussite de la mise en cache
Ressources plus de CPU/RAM par requête nettement moins de ressources
Mise à l'échelle limité par les processus PHP s'adapte efficacement grâce à NGINX
Dépendances Conflits possibles entre thèmes et plugins fonctionne sous WordPress

J'utilise également des clés de cache claires et une structure de dossiers bien organisée afin de séparer les contenus par hôte, schéma et URI. Si vous cherchez un point de départ, vous pouvez consulter mon guide sur la Optimisation du cache NGINX s'en servir comme point de repère. La configuration reste ainsi claire et les extensions futures s'effectuent plus rapidement.

Scénarios appropriés et exceptions importantes

C'est celui qui en profite le plus Contenu, c'est-à-dire les blogs, les magazines, les pages d'accueil et les sites d'entreprise recevant de nombreuses visites anonymes. Je mets en cache toutes les pages qui restent identiques pour les visiteurs, en excluant tout ce qui est personnalisé. Cela inclut la connexion, le profil, les formulaires de commentaires, le panier WooCommerce, la caisse et la section « Mon compte ». Les cookies et les en-têtes servent de critères pour contourner le cache de manière ciblée. Ainsi, les pages publiques restent ultra-rapides, tandis que les zones sensibles conservent correctement leur caractère dynamique et que les utilisateurs bénéficient d’une expérience fluide. sert être.

Principes techniques : zone de cache, clé, en-tête

Je définis d'abord le Chemin d'accès au cache et une zone dans la configuration NGINX, avec la taille et le délai d'inactivité. La clé de cache contient le schéma, l’hôte et l’URI, ainsi que, de manière facultative, les chaînes de requête, afin que les variantes soient stockées séparément. Grâce aux règles `fastcgi_cache_valid`, `bypass` et `no-cache`, je contrôle quand les requêtes contournent le cache. Les en-têtes importants tels que Set-Cookie, Authorization et certains cookies de WordPress ou WooCommerce indiquent que le contenu est dynamique. De plus, je définis quelles pages d’erreur ou réponses 50x sont brièvement mises en cache, afin que le site continue de fonctionner même en cas de forte affluence répond.

Gestion du cache et stratégie de purge

Un cache ne prend tout son sens que si les mises à jour sont fiables dérouler. Lorsque j'enregistre un article, je lance une purge ciblée pour les URL concernées, y compris les pages d'accueil, les catégories et les flux. De plus, je définis un TTL approprié afin que les contenus soient régénérés périodiquement. Pour les sites de grande envergure, le préchargement des pages d'atterrissage importantes permet d'éviter que le premier visiteur ne subisse un démarrage à froid. Après chaque modification, je vérifie le taux de réussite du cache et m'assure que les purges n'ont pas laissé de fragments obsolètes laisser derrière soi.

Règles pour WordPress et WooCommerce

Je laisse systématiquement les utilisateurs connectés accéder au cache terminé, généralement à l'aide du cookie « wordpress_logged_in ». Pour WooCommerce, j'exclue le panier, la page de paiement et la page « Mon compte » via des modèles d'URI et je prends en compte les cookies tels que « woocommerce_items_in_cart ». En revanche, je mets en cache normalement les pages de produits, de catégories et de contenu. De plus, je vide le cache lorsque le stock ou le prix change via un hook. Cette séparation permet de garantir la rapidité des pages publiques sans affecter les processus d’achat. déranger.

Choisir correctement le TTL, le Stale et le Locking

Je définis la durée de vie (TTL) du contenu en fonction des besoins concrets, par exemple de quelques minutes à quelques heures, selon Actualité et le trafic. Les options « stale » me permettent de fournir temporairement des objets périmés, pendant qu’une nouvelle version est générée en arrière-plan. Le verrouillage empêche l’effet « stampede » lorsque de nombreuses requêtes accèdent simultanément à un objet périmé. Des règles adaptées en matière d’erreurs et de délais d’expiration garantissent que les visiteurs obtiennent une réponse même en cas de brève interruption. Je donne plus de détails sur ces directives dans mon guide concis Stratégies de contrôle du cache, qui s'associent bien avec FastCGI Cache.

Suivi et données de mesure qui comptent

Je commence par mesurer la TTFB, puis le nombre de requêtes par seconde et la charge CPU, ventilés entre les accès au cache réussis et ceux qui ont échoué. Les journaux NGINX et les en-têtes de réponse m’indiquent s’il s’agit d’un HIT, d’un MISS, d’un BYPASS ou d’un EXPIRED. Une augmentation du taux de réussite (hit rate) accompagnée d’une baisse de l’utilisation du processeur m’indique que les règles sont efficaces. De plus, je surveille les E/S du système de fichiers et le nombre de processus PHP actifs. Pour la mise en cache conditionnelle, j’utilise judicieusement les en-têtes ETag/Last-Modified et je renvoie à mon guide sur Mise en cache conditionnelle avec ETag, afin que le cache du navigateur et celui du serveur fonctionnent en harmonie et que la charge du réseau soit sensiblement réduite tombe.

Erreurs courantes et comment je les résous

Une erreur courante consiste à définir un champ trop large Clé de cache, qui masque les variantes et renvoie des contenus erronés. Autre point critique : l’absence d’exclusions pour les cookies tels que « wordpress_logged_in » ou les signaux WooCommerce. Si les purges ne concernent que la page unique, les pages d’archives et d’accueil restent obsolètes ; j’étends donc les cibles concernées. J’ai également souvent besoin d’inclure les chaînes de requête dans la clé, sinon une variante écrase l’autre. Des TTL trop courts génèrent des taux de MISS inutiles, tandis que des TTL trop longs augmentent le risque de contenu obsolète Pages.

Processus pratique de mise en œuvre

Je commence chaque projet avec une vision claire Plan: Définir les objectifs, marquer les chemins à mettre en cache, définir les exceptions dynamiques. Ensuite, je configure le chemin de cache, la zone, la clé et les règles d'en-tête. À l'étape suivante, je teste les HIT/MISS, je vérifie les cookies et j'observe le TTFB lors d'un test de charge léger. Ensuite, j’optimise la TTL, les paramètres « Stale » et « Locking » jusqu’à ce que les courbes semblent cohérentes. Pour finir, je documente les itinéraires de purge, les responsabilités et une brève procédure à l’intention des rédacteurs, afin que les contenus soient toujours frais rester.

Configuration pratique de NGINX et exemples

Je considère que la configuration clair structuré : une zone de cache centrale, une clé unique, des règles de saut claires et des en-têtes de diagnostic utiles. Voici à quoi ressemble un bon point de départ :

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m \
    inactive=60m use_temp_path=off loader_files=200 loader_sleep=50ms loader_threshold=300ms;

map $request_method $skip_non_get {
    default 1;
    GET 0;
    HEAD 0;
}

map $http_cookie $skip_cookie {
    default 0;
    ~*(wordpress_logged_in|comment_author|woocommerce_items_in_cart|wp_woocommerce_session|woocommerce_cart_hash) 1;
}

map $arg_preview $is_preview { par défaut 0 ; 1 1 ; }
map $request_uri $is_search { par défaut 0 ; ~*\?s= 1 ; }

server {
    # ...
    set $skip_cache 0 ;
    if ($skip_non_get) { set $skip_cache 1; }
    if ($skip_cookie)  { set $skip_cache 1; }
    if ($is_preview)   { set $skip_cache 1; }
    if ($is_search)    { set $skip_cache 1; }

    location ~ \.php$ {
 include fastcgi_params;
 fastcgi_pass unix:/run/php/php8.2-fpm.sock;

        fastcgi_cache WORDPRESS;
 fastcgi_cache_key "$scheme$request_method$host$request_uri";
 fastcgi_cache_bypass    $skip_cache;
        fastcgi_no_cache $skip_cache;

 fastcgi_cache_valid 200 301 302 10m;
        fastcgi_cache_valid 404 1m;
 fastcgi_cache_use_stale updating error timeout http_500 http_502 http_503;
 fastcgi_cache_lock on;
 fastcgi_cache_lock_timeout 5s;

        add_header X-Cache $upstream_cache_status always;
 add_header X-Cache-Key   $scheme$host$request_uri always;
    }
}

Je compléterai cela plus tard, en fonction du projet, avec des signaux Vary (par exemple, langue, devise) et des exclusions plus précises. Important : POST, PUT, DELETE et tout ce qui contient Autorisation ou Définir un cookie je contourne systématiquement PHP.

Les stratégies relatives aux variantes et aux cookies en détail

Moins un document HTML comporte de variantes, plus le taux de réussite est élevé. Je réduis délibérément le nombre de variantes et je ne sépare que là où les La version distingue:

  • Langue: Une seule version HTML adaptative est l'idéal. S'il existe des versions linguistiques distinctes, j'utilise un cookie de langue ou l'URI (par exemple /de/, /en/) dans la clé, et non l'agent utilisateur.
  • Appareils: J'évite les fractionnements UA. Le CSS « mobile first » et les mises en page adaptatives préservent le cache compact.
  • Devise/Pays: Pour les boutiques en ligne dotées d'une fonctionnalité de géolocalisation ou de changement de devise, j'utilise un cookie stable plutôt que l'adresse IP. Sinon, la cardinalité explose.
  • Chaînes de requête: J'ajoute les paramètres utiles (par exemple, pagination, filter) à la liste blanche et j'ignore les paramètres de suivi (utm_*, gclid) afin d'éviter la création de variantes superflues.

Il faut faire particulièrement attention aux cookies des plugins de consentement ou de bannières : s’ils installent déjà des cookies sur la page d’accueil, NGINX peut interpréter à tort qu’il s’agit d’un contenu dynamique. Je veille à ce que uniquement visuel Les bannières sans incidence fonctionnelle ne déclenchent pas de cascade Cache-BYPASS.

Système de fichiers, zone de cache et optimisation du chargeur

Le choix de la mémoire cache a un impact considérable sur les performances. J'utilise des SSD locaux rapides et je prévois de keys_zone suffisamment grande (par exemple, 100 à 256 Mo pour les index), afin que les métadonnées ne soient pas évincées. La inactif‑Je détermine cette durée en fonction du profil de trafic : les contenus à longue traîne tirent profit d'une inactivité plus longue, ce qui n'est généralement pas le cas des portails très dynamiques. Les paramètres loader_* me permettent de régler l'intensité avec laquelle NGINX précharge les objets, afin que le système, sous charge, calme reste. Pour les sites très sollicités, un cache partiel dans tmpfs peut s'avérer utile, mais je vérifie alors minutieusement la pression sur la RAM et la consommation d'inodes. La rotation des journaux et les limites du nombre de fichiers empêchent le volume de se remplir ; la surveillance porte sur les temps d'attente d'E/S, l'espace libre et les descripteurs de fichiers ouverts.

Organiser clairement le cache du CDN et celui du navigateur

J'aime bien associer le cache NGINX à un Edge-CDN et des valeurs TTL fiables pour les navigateurs. Le principe est le suivant : la source (NGINX) fournit des pages HTML cohérentes, le CDN les met en cache, et le navigateur reçoit des valeurs « max-age » modérément courtes afin que les rédacteurs puissent voir rapidement les modifications. Les mécanismes de mise à jour et revalidate‑ Je configure les stratégies de manière à ce que les nœuds Edge puissent continuer à servir le contenu pendant que NGINX procède à un nouveau rendu en arrière-plan. Je déclenche les purges selon un ordre défini (d’abord le CDN, puis l’origine) ou de manière synchrone aux deux endroits, afin d’éviter l’apparition de contenus obsolètes. Je vérifie également que les en-têtes CDN, tels que « Age », « Cache-Status » et « Vary », n’entrent pas en conflit avec les règles de mon serveur.

Préparation, déploiement et workflows éditoriaux

Pour éviter que des milliers d'utilisateurs ne déclenchent le redémarrage à froid après une purge, je préchauffe les pages importantes ciblé : pages d’accueil, meilleures ventes, catégories, pages du magazine. Un préchargeur léger lit le plan du site, effectue les requêtes en parallèle et respecte les limites de débit afin que ni le PHP ni la base de données n’atteignent leurs limites. Lors des déploiements, je fais la distinction entre un « full flush » (modification du thème ou du code) et un « partiel flush » (mise à jour du contenu), et je documente les Étapes pour la rédaction et l'équipe opérationnelle. Cela permet de limiter la durée des fenêtres de mise en production et de réduire les risques.

Multisite, multilinguisme et logique monétaire

Avec WordPress Multisite, je sépare rigoureusement les clés de cache en fonction du nom d'hôte ou de l'ID du site, afin que Sous-sites sont clairement isolés. Pour les sites multilingues utilisant WPML/Polylang, je privilégie les chemins de langue (de/en) ou les domaines dédiés ; la clé contient alors le schéma, l'hôte et le chemin. Dans les boutiques en ligne, je tiens compte avec précision des cookies de devise et de la géolocalisation : je mets en cache les pages de produits et de catégories par devise, tandis que le panier et la caisse restent dynamiques. Si les prix ou les taux d’imposition changent, je déclenche une partiellement Purgez (produit, catégorie, modules teaser) afin que les pages d'accueil principales soient rapidement cohérentes.

Tests sous charge, métriques et restauration

Avant la mise en service, je simule des scénarios réalistes Peaks (GET/HEAD mix, ressources, HTML) et je sépare rigoureusement les mesures : « warm » vs « cold », avec/sans CDN, utilisateurs connectés vs anonymes. Je surveille les valeurs P50/P95 du TTFB, les taux d’erreur, la saturation du processeur, le temps d’attente d’E/S et le nombre de processus PHP. Dans NGINX, j’active un format de journalisation adapté avec $upstream_cache_status et je vérifie des échantillons directement dans l’en-tête de réponse (HIT/MISS/BYPASS/EXPIRED). Un chemin de retour en arrière rapide (commutateur « Skip » pour le fonctionnement du cache, TTL réduit, désactivation de certaines règles) me permet, en cas d’anomalies, immédiatement peut réagir sans déstabiliser l'ensemble du système.

Sécurité, exactitude et protection des données

Je veille systématiquement à ce qu’aucun contenu confidentiel ne soit mis en cache : espaces d’administration, modes d’aperçu, pages privées, actions protégées par un nonce. Je respecte la distinction entre HEAD et GET ; les requêtes POST restent non mises en cache. Les en-têtes « Set-Cookie » et « Authorization » sont considérées comme des règles strictes. BYPASS- Signaux. J'exclue les pages d'aperçu (preview=true) et les résultats de recherche (s=) afin d'éviter tout résultat erroné. Je vérifie également qu’aucune donnée à caractère personnel ne se retrouve dans les réponses HTML, qui seraient ensuite largement stockées dans le cache. Si nécessaire, j’encapsule les fragments personnalisés via des points de terminaison AJAX distincts, que je pas cache.

Gérer correctement les cas limites et les exceptions

Certains cas de figure reviennent régulièrement : je mets brièvement en cache les plans de site XML et les points de terminaison de flux (par exemple, 1 à 5 minutes). Je revalide les codes 301/302 séparément afin d’éviter les boucles de redirection. Les pages d’archives et de pagination se voient attribuer des TTL modérés, car elles contiennent souvent des liens vers frais Contenir du contenu. Les paramètres qui n'influencent que le tri peuvent figurer dans la clé, mais ne doivent pas raccourcir artificiellement la durée de vie (TTL). Et si un plugin installe des cookies de manière inattendue, je vérifie s'ils sont réellement nécessaires à l'affichage du code HTML pertinent sont – sinon, je les marque comme « à ignorer » afin d'éviter les résultats BYPASS inutiles.

En bref

Avec NGINX FastCGI Cache, j'accélère WordPress au niveau de la Source, génère directement du code HTML et évite ainsi les processus PHP coûteux. Des exclusions bien définies et une purge fiable maintiennent le contenu à jour, tandis que le TTFB et les valeurs CPU diminuent considérablement. Un TTL adapté à la pratique, avec des mécanismes de « stale » et de « locking », garantit une diffusion fluide même en cas de pics de trafic. En surveillant systématiquement les indicateurs et en affinant continuellement les règles, on obtient des pages rapides sur le long terme. Le site web gagne ainsi en réactivité, reste facile à maintenir et se développe en toute sérénité face à une augmentation Trafic à l'intérieur.

Derniers articles