Zum Inhalt

FastCGI Cache Bereinigung für PHP-FPM

Ultraschnelles Caching für WordPress mit automatischer, gezielter Cache-Invalidierung.


  • Kein Proxy erforderlich


    FastCGI-Cache kommuniziert direkt mit PHP-FPM – kein Overhead durch einen Reverse-Proxy

  • Mikrosekunden-Antwort


    Aus dem Cache bereitgestellte Seiten direkt aus dem Speicher oder SSD durch NGINX

  • Selektive Bereinigung


    Nur geänderte Seiten werden bereinigt, der Rest des Caches bleibt aktiv

  • Integrierte Sicherheit


    Umgeht den Cache für angemeldete Benutzer, Administratoren und WooCommerce-Warenkörbe


Wann FastCGI vs Proxy-Cache verwenden

Funktion FastCGI-Cache Proxy-Cache
Backend PHP-FPM (direkt) Jeder HTTP-Backend
Latenz Niedriger (kein Proxy-Hops) Etwas höher
Anwendungsfall WordPress, PHP-Apps Node.js, Python usw.
Konfigurationskomplexität Einfacher Flexibler

Verwenden Sie FastCGI-Cache, wenn Sie WordPress oder PHP direkt auf NGINX ohne eine Reverse-Proxy-Schicht ausführen.


Schnelle Einrichtung

Schritt 1: Erforderliche Module installieren

# GetPageSpeed-Repository installieren
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Cache-Bereinigungsmodul installieren
dnf -y install nginx-module-cache-purge

Aktivieren Sie in /etc/nginx/nginx.conf:

load_module modules/ngx_http_cache_purge_module.so;

Schritt 2: FastCGI-Cache konfigurieren

Fügen Sie zu Ihrem http-Block in /etc/nginx/nginx.conf hinzu:

# FastCGI-Cache-Zonen-Definition
fastcgi_cache_path /var/cache/nginx/fastcgi
                   levels=1:2
                   keys_zone=WORDPRESS:100m
                   max_size=10g
                   inactive=60m
                   use_temp_path=off;

# Cache-Schlüssel (was jede gecachte Seite einzigartig macht)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Schritt 3: Serverblock konfigurieren

Erstellen oder aktualisieren Sie Ihren WordPress-Serverblock:

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

    # Cache-Einstellungen
    set $skip_cache 0;

    # POST-Anfragen nicht cachen
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # URLs mit Abfragezeichenfolgen nicht cachen
    if ($query_string != "") {
        set $skip_cache 1;
    }

    # WordPress-Admin, Login oder spezifische Pfade nicht cachen
    if ($request_uri ~* "/wp-admin/|/wp-login.php|/xmlrpc.php|/wp-cron.php") {
        set $skip_cache 1;
    }

    # Für angemeldete Benutzer oder kürzlich kommentierende Benutzer nicht cachen
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $skip_cache 1;
    }

    # WooCommerce-Seiten nicht cachen
    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;
    }

    # Cache-Status-Header
    add_header X-Cache-Status $upstream_cache_status;

    # PURGE-Methode aktivieren
    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;

        # FastCGI-Caching
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_valid 404 1m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # Wichtig für dynamische Inhalte
        fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
        fastcgi_cache_lock on;
    }

    # Statische Dateien - keine Caching-Konfiguration erforderlich
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Erstellen Sie das Cache-Verzeichnis und laden Sie neu:

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

Schritt 4: WordPress-Plugin installieren

  1. Gehen Sie zu Plugins → Neu hinzufügen
  2. Suchen Sie nach "Proxy Cache Purge"
  3. Installieren und aktivieren
wp plugin install varnish-http-purge --activate

Konfigurieren Sie das Plugin:

  1. Gehen Sie zu Einstellungen → Proxy Cache Purge
  2. Setzen Sie Benutzerdefinierte IP auf 127.0.0.1
  3. Speichern

Schritt 5: NGINX-Cache-Backend konfigurieren

Ab Proxy Cache Purge 5.9.0 unterstützt das Plugin nativ das Wildcard-Purge-Format von NGINX. Konfigurieren Sie es, um das NGINX-Backend zu verwenden:

  1. Gehen Sie zu Proxy Cache Purge → Einstellungen
  2. Wählen Sie unter Cache-Backend NGINX
  3. Klicken Sie auf Einstellungen speichern

Fügen Sie zu Ihrer wp-config.php hinzu:

define( 'VHP_PURGE_BACKEND', 'nginx' );
Legacy: Plugin-Version < 5.9.0

Wenn Sie Proxy Cache Purge verwenden, das älter als 5.9.0 ist, erstellen Sie wp-content/mu-plugins/nginx-cache-purge-fix.php:

<?php
/**
 * Plugin Name: NGINX FastCGI Cache Purge Fix
 * Description: Fügt Wildcard hinzu, um alle Cache-Varianten zu bereinigen
 */
add_filter("vhp_purgeme_path", function($purgeme, $schema, $host, $path, $pregex, $p) {
    if (empty($pregex)) {
        $purgeme .= "*";
    }
    return $purgeme;
}, 10, 6);

Testen

# Erste Anfrage - sollte MISS sein
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

# Zweite Anfrage - sollte HIT sein
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: HIT

# Cache bereinigen
curl -sX PURGE 'http://127.0.0.1/*' -H 'Host: example.com'

# Überprüfen, ob bereinigt wurde
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

So funktioniert es

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

    B -->|"Cache HIT"| C["⚡ Sofortige Antwort"]
    B -->|"Cache MISS"| D["PHP-FPM"]
    D --> E["WordPress"]
    E --> D
    D -->|"Im Cache speichern"| 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

Leistungsvergleich

Metrik Kein Cache FastCGI-Cache
Antwortzeit 200-500ms 5-20ms
Anfragen/Sekunde 50-100 5.000+
CPU-Nutzung Hoch Minimal
Speicher Hoch (PHP) Niedrig (NGINX)

Auswirkungen in der Praxis

FastCGI-Cache verbessert typischerweise die Antwortzeiten von WordPress um 10-50x und kann Verkehrsspitzen problemlos bewältigen.


Erweiterte Konfiguration

Unterschiedliche Cache-Dauern nach Inhaltstyp

# Seiten für 60 Minuten cachen
fastcgi_cache_valid 200 60m;

# Weiterleitungen für 10 Minuten cachen
fastcgi_cache_valid 301 302 10m;

# Fehler nicht lange cachen
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 503 504 0;

Veraltete Inhalte während von Fehlern bereitstellen

fastcgi_cache_use_stale error timeout invalid_header
                        updating http_500 http_502 http_503 http_504;

Cache-Sperre zur Verhinderung von Stampeden

fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;

Wenn mehrere Anfragen gleichzeitig auf eine nicht gecachte Seite zugreifen, geht nur eine Anfrage zu PHP-FPM. Die anderen warten, bis der Cache gefüllt ist.


Fehlersuche

Seiten werden nicht gecacht

Überprüfen Sie die $skip_cache-Variable. Häufige Probleme:

  • Abfragezeichenfolgen auf allen URLs (einige Plugins fügen ?ver= zu Seiten hinzu)
  • Cookies werden auf allen Seiten gesetzt
  • Überprüfen: curl -sI your-url | grep Set-Cookie
Angemeldete Seiten werden gecacht

Überprüfen Sie, ob die Cookie-Prüfung Ihre Auth-Cookies umfasst:

if ($http_cookie ~* "wordpress_logged_in") {
    set $skip_cache 1;
}
Cache wird nicht bereinigt
  • Überprüfen Sie die Plugin-Einstellung: Benutzerdefinierte IP = 127.0.0.1
  • Stellen Sie sicher, dass das Cache-Backend auf NGINX eingestellt ist (oder VHP_PURGE_BACKEND in wp-config.php definiert ist)
  • Testen Sie manuell: curl -X PURGE 'http://127.0.0.1/page/*'

Verwandt