Aller au contenu

Purge de Cache FastCGI pour PHP-FPM

Mise en cache ultra-rapide pour WordPress avec invalidation de cache automatique et ciblée.


  • Pas de Proxy Nécessaire


    Le cache FastCGI communique directement avec PHP-FPM—sans surcharge de proxy inverse

  • Réponse en Microsecondes


    Pages mises en cache servies directement depuis la mémoire ou SSD par NGINX

  • Purge Sélective


    Seules les pages modifiées sont purgées, le reste du cache reste actif

  • Sécurité Intégrée


    Contourne le cache pour les utilisateurs connectés, les administrateurs et les paniers WooCommerce


Quand Utiliser FastCGI vs Proxy Cache

Fonctionnalité Cache FastCGI Cache Proxy
Backend PHP-FPM (direct) Tout backend HTTP
Latence Inférieure (pas de saut de proxy) Légèrement plus élevée
Cas d'utilisation WordPress, applications PHP Node.js, Python, etc.
Complexité de configuration Plus simple Plus flexible

Utilisez le cache FastCGI si vous exécutez WordPress ou PHP directement sur NGINX sans couche de proxy inverse.


Configuration Rapide

Étape 1 : Installer les Modules Requis

# Installer le dépôt GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Installer le module de purge de cache
dnf -y install nginx-module-cache-purge

Activez dans /etc/nginx/nginx.conf :

load_module modules/ngx_http_cache_purge_module.so;

Étape 2 : Configurer le Cache FastCGI

Ajoutez à votre bloc http dans /etc/nginx/nginx.conf :

# Définition de la zone de cache FastCGI
fastcgi_cache_path /var/cache/nginx/fastcgi
                   levels=1:2
                   keys_zone=WORDPRESS:100m
                   max_size=10g
                   inactive=60m
                   use_temp_path=off;

# Clé de cache (ce qui rend chaque page mise en cache unique)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Étape 3 : Configurer le Bloc Serveur

Créez ou mettez à jour votre bloc serveur WordPress :

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.php;

    # Paramètres de cache
    set $skip_cache 0;

    # Ne pas mettre en cache les requêtes POST
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # Ne pas mettre en cache les URL avec des chaînes de requête
    if ($query_string != "") {
        set $skip_cache 1;
    }

    # Ne pas mettre en cache l'administration WordPress, la connexion ou des chemins spécifiques
    if ($request_uri ~* "/wp-admin/|/wp-login.php|/xmlrpc.php|/wp-cron.php") {
        set $skip_cache 1;
    }

    # Ne pas mettre en 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 $skip_cache 1;
    }

    # Ne pas mettre en cache les pages WooCommerce
    if ($request_uri ~* "/cart/|/checkout/|/my-account/") {
        set $skip_cache 1;
    }
    if ($http_cookie ~* "woocommerce_cart_hash|woocommerce_items_in_cart") {
        set $skip_cache 1;
    }

    # En-tête de statut de cache
    add_header X-Cache-Status $upstream_cache_status;

    # Activer la méthode PURGE
    fastcgi_cache_purge PURGE from 127.0.0.1;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;

        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;

        # Mise en cache FastCGI
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_valid 404 1m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # Important pour le contenu dynamique
        fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
        fastcgi_cache_lock on;
    }

    # Fichiers statiques - aucune configuration de cache nécessaire
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Créez le répertoire de cache et rechargez :

mkdir -p /var/cache/nginx/fastcgi
chown nginx:nginx /var/cache/nginx/fastcgi
nginx -t && systemctl reload nginx

Étape 4 : Installer le Plugin WordPress

  1. Allez dans Extensions → Ajouter
  2. Recherchez "Proxy Cache Purge"
  3. Installez et activez
wp plugin install varnish-http-purge --activate

Configurez le plugin :

  1. Allez dans Réglages → Proxy Cache Purge
  2. Définissez IP Personnalisée sur 127.0.0.1
  3. Enregistrez

Étape 5 : Configurer le Backend de Cache NGINX

À partir de Proxy Cache Purge 5.9.0, le plugin prend en charge nativement le format de purge par wildcard de NGINX. Configurez-le pour utiliser le backend NGINX :

  1. Allez dans Proxy Cache Purge → Paramètres
  2. Sous Backend de Cache, sélectionnez NGINX
  3. Cliquez sur Enregistrer les Paramètres

Ajoutez à votre wp-config.php :

define( 'VHP_PURGE_BACKEND', 'nginx' );
Héritage : Version du plugin < 5.9.0

Si vous utilisez Proxy Cache Purge version inférieure à 5.9.0, créez wp-content/mu-plugins/nginx-cache-purge-fix.php :

<?php
/**
 * Nom du Plugin : NGINX FastCGI Cache Purge Fix
 * Description : Ajoute un wildcard pour purger toutes les variantes de cache
 */
add_filter("vhp_purgeme_path", function($purgeme, $schema, $host, $path, $pregex, $p) {
    if (empty($pregex)) {
        $purgeme .= "*";
    }
    return $purgeme;
}, 10, 6);

Test

# Première requête - devrait être MISS
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

# Deuxième requête - devrait être HIT
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: HIT

# Purger le cache
curl -sX PURGE 'http://127.0.0.1/*' -H 'Host: example.com'

# Vérifier la purge
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

Comment Ça Marche

flowchart LR
    A["👤 Visiteur"] -->|"GET /post/"| B["NGINX"]

    B -->|"Cache HIT"| C["⚡ Réponse Instantanée"]
    B -->|"Cache MISS"| D["PHP-FPM"]
    D --> E["WordPress"]
    E --> D
    D -->|"Stocker dans le cache"| B
    B --> C

    style A fill:#667eea
    style B fill:#009639,color:#fff
    style C fill:#48bb78,color:#fff
    style D fill:#4a90d9,color:#fff
    style E fill:#4a90d9,color:#fff

Comparaison de Performance

Métrique Pas de Cache Cache FastCGI
Temps de Réponse 200-500ms 5-20ms
Requêtes/sec 50-100 5,000+
Utilisation CPU Élevée Minimale
Mémoire Élevée (PHP) Faible (NGINX)

Impact dans le monde réel

Le cache FastCGI améliore généralement les temps de réponse de WordPress de 10 à 50 fois et peut gérer les pics de trafic sans problème.


Configuration Avancée

Cacher Différentes Durées par Type de Contenu

# Mettre en cache les pages pendant 60 minutes
fastcgi_cache_valid 200 60m;

# Mettre en cache les redirections pendant 10 minutes
fastcgi_cache_valid 301 302 10m;

# Ne pas mettre en cache les erreurs longtemps
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 503 504 0;

Servir du Contenu Obsolète Pendant les Erreurs

fastcgi_cache_use_stale error timeout invalid_header
                        updating http_500 http_502 http_503 http_504;

Verrou de Cache pour Prévenir les Stampedes

fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;

Lorsque plusieurs requêtes atteignent une page non mise en cache simultanément, seule une requête va à PHP-FPM. Les autres attendent que le cache se remplisse.


Dépannage

Pages non mises en cache

Vérifiez la variable $skip_cache. Problèmes courants :

  • Chaînes de requête sur toutes les URL (certains plugins ajoutent ?ver= aux pages)
  • Cookies définis sur toutes les pages
  • Vérifiez : curl -sI votre-url | grep Set-Cookie
Pages connectées mises en cache

Vérifiez que la vérification des cookies inclut vos cookies d'authentification :

if ($http_cookie ~* "wordpress_logged_in") {
    set $skip_cache 1;
}
Cache non purgé
  • Vérifiez le paramètre du plugin : IP Personnalisée = 127.0.0.1
  • Assurez-vous que le Backend de Cache est défini sur NGINX (ou que VHP_PURGE_BACKEND est défini dans wp-config.php)
  • Testez manuellement : curl -X PURGE 'http://127.0.0.1/page/*'

Liens Connexes

  • Guide de Cache Proxy


    Alternative pour les backends non-PHP

    Cache Proxy

  • Module cache-purge


    Référence complète des directives

    Documentation

  • Module PageSpeed


    Couche d'optimisation supplémentaire

    Documentation