Saltar a contenido

Purga de Caché FastCGI para PHP-FPM

Caché ultra-rápida para WordPress con invalidación de caché automática y quirúrgica.


  • No se Requiere Proxy


    La caché FastCGI se comunica directamente con PHP-FPM—sin sobrecarga de proxy inverso

  • Respuesta en Microsegundos


    Páginas en caché servidas directamente desde la memoria o SSD por NGINX

  • Purga Selectiva


    Solo se purgan las páginas cambiadas, el resto de la caché permanece activa

  • Seguridad Incorporada


    Omite la caché para usuarios registrados, administradores y carritos de WooCommerce


Cuándo Usar FastCGI vs Caché Proxy

Característica Caché FastCGI Caché Proxy
Backend PHP-FPM (directo) Cualquier backend HTTP
Latencia Menor (sin salto de proxy) Ligeramente mayor
Caso de uso WordPress, aplicaciones PHP Node.js, Python, etc.
Complejidad de configuración Más simple Más flexible

Usa caché FastCGI si estás ejecutando WordPress o PHP directamente en NGINX sin una capa de proxy inverso.


Configuración Rápida

Paso 1: Instalar Módulos Requeridos

# Instalar el repositorio de GetPageSpeed
dnf -y install https://extras.getpagespeed.com/release-latest.rpm

# Instalar el módulo de purga de caché
dnf -y install nginx-module-cache-purge

Habilitar en /etc/nginx/nginx.conf:

load_module modules/ngx_http_cache_purge_module.so;

Paso 2: Configurar Caché FastCGI

Agrega a tu bloque http en /etc/nginx/nginx.conf:

# Definición de la zona de caché FastCGI
fastcgi_cache_path /var/cache/nginx/fastcgi
                   levels=1:2
                   keys_zone=WORDPRESS:100m
                   max_size=10g
                   inactive=60m
                   use_temp_path=off;

# Clave de caché (lo que hace que cada página en caché sea única)
fastcgi_cache_key "$scheme$request_method$host$request_uri";

Paso 3: Configurar el Bloque del Servidor

Crea o actualiza tu bloque de servidor de WordPress:

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

    # Configuración de caché
    set $skip_cache 0;

    # No almacenar en caché las solicitudes POST
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    # No almacenar en caché URLs con cadenas de consulta
    if ($query_string != "") {
        set $skip_cache 1;
    }

    # No almacenar en caché el administrador de WordPress, inicio de sesión o rutas específicas
    if ($request_uri ~* "/wp-admin/|/wp-login.php|/xmlrpc.php|/wp-cron.php") {
        set $skip_cache 1;
    }

    # No almacenar en caché para usuarios registrados o comentaristas recientes
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
        set $skip_cache 1;
    }

    # No almacenar en caché las páginas de 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;
    }

    # Encabezado de estado de caché
    add_header X-Cache-Status $upstream_cache_status;

    # Habilitar el método 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;

        # Caché FastCGI
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid 200 60m;
        fastcgi_cache_valid 404 1m;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;

        # Importante para contenido dinámico
        fastcgi_cache_use_stale error timeout invalid_header http_500 http_503;
        fastcgi_cache_lock on;
    }

    # Archivos estáticos - no se necesita configuración de caché
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
}

Crea el directorio de caché y recarga:

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

Paso 4: Instalar el Plugin de WordPress

  1. Ve a Plugins → Añadir Nuevo
  2. Busca "Proxy Cache Purge"
  3. Instala y activa
wp plugin install varnish-http-purge --activate

Configura el plugin:

  1. Ve a Ajustes → Proxy Cache Purge
  2. Establece IP Personalizada en 127.0.0.1
  3. Guarda

Paso 5: Configurar el Backend de Caché de NGINX

A partir de Proxy Cache Purge 5.9.0, el plugin admite nativamente el formato de purga con comodín de NGINX. Configúralo para usar el backend de NGINX:

  1. Ve a Proxy Cache Purge → Configuración
  2. En Backend de Caché, selecciona NGINX
  3. Haz clic en Guardar Configuración

Agrega a tu wp-config.php:

define( 'VHP_PURGE_BACKEND', 'nginx' );
Legado: Versión del plugin < 5.9.0

Si estás ejecutando Proxy Cache Purge anterior a 5.9.0, crea wp-content/mu-plugins/nginx-cache-purge-fix.php:

<?php
/**
 * Nombre del Plugin: NGINX FastCGI Cache Purge Fix
 * Descripción: Agrega comodín para purgar todas las variantes de caché
 */
add_filter("vhp_purgeme_path", function($purgeme, $schema, $host, $path, $pregex, $p) {
    if (empty($pregex)) {
        $purgeme .= "*";
    }
    return $purgeme;
}, 10, 6);

Pruebas

# Primera solicitud - debería ser MISS
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

# Segunda solicitud - debería ser HIT
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: HIT

# Purga la caché
curl -sX PURGE 'http://127.0.0.1/*' -H 'Host: example.com'

# Verifica purgada
curl -sI http://127.0.0.1/ -H 'Host: example.com' | grep X-Cache
# X-Cache-Status: MISS

Cómo Funciona

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

    B -->|"Cache HIT"| C["⚡ Respuesta Instantánea"]
    B -->|"Cache MISS"| D["PHP-FPM"]
    D --> E["WordPress"]
    E --> D
    D -->|"Almacenar en caché"| 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

Comparación de Rendimiento

Métrica Sin Caché Caché FastCGI
Tiempo de Respuesta 200-500ms 5-20ms
Solicitudes/seg 50-100 5,000+
Uso de CPU Alto Mínimo
Memoria Alta (PHP) Baja (NGINX)

Impacto en el Mundo Real

La caché FastCGI típicamente mejora los tiempos de respuesta de WordPress en 10-50x y puede manejar picos de tráfico sin esfuerzo.


Configuración Avanzada

Caché de Diferentes Duraciones por Tipo de Contenido

# Caché de páginas durante 60 minutos
fastcgi_cache_valid 200 60m;

# Caché de redirecciones durante 10 minutos
fastcgi_cache_valid 301 302 10m;

# No almacenar en caché errores por mucho tiempo
fastcgi_cache_valid 404 1m;
fastcgi_cache_valid 500 502 503 504 0;

Servir Contenido Obsoleto Durante Errores

fastcgi_cache_use_stale error timeout invalid_header
                        updating http_500 http_502 http_503 http_504;

Bloqueo de Caché para Prevenir Stampedes

fastcgi_cache_lock on;
fastcgi_cache_lock_timeout 5s;

Cuando múltiples solicitudes acceden a una página no almacenada en caché simultáneamente, solo una solicitud va a PHP-FPM. Las demás esperan a que la caché se llene.


Solución de Problemas

Páginas no se están almacenando en caché

Verifica la variable $skip_cache. Problemas comunes:

  • Cadenas de consulta en todas las URLs (algunos plugins añaden ?ver= a las páginas)
  • Cookies establecidas en todas las páginas
  • Verifica: curl -sI tu-url | grep Set-Cookie
Páginas de usuarios registrados siendo almacenadas en caché

Verifica que la comprobación de cookies incluya tus cookies de autenticación:

if ($http_cookie ~* "wordpress_logged_in") {
    set $skip_cache 1;
}
Caché no purgándose
  • Verifica la configuración del plugin: IP Personalizada = 127.0.0.1
  • Asegúrate de que el Backend de Caché esté configurado en NGINX (o que VHP_PURGE_BACKEND esté definido en wp-config.php)
  • Prueba manualmente: curl -X PURGE 'http://127.0.0.1/page/*'

Relacionados