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
- Ve a Plugins → Añadir Nuevo
- Busca "Proxy Cache Purge"
- Instala y activa
wp plugin install varnish-http-purge --activate
Configura el plugin:
- Ve a Ajustes → Proxy Cache Purge
- Establece IP Personalizada en
127.0.0.1 - 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:
- Ve a Proxy Cache Purge → Configuración
- En Backend de Caché, selecciona NGINX
- 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_BACKENDesté definido enwp-config.php) - Prueba manualmente:
curl -X PURGE 'http://127.0.0.1/page/*'
Relacionados
-
Guía de Caché Proxy
Alternativa para backends no PHP
-
Módulo cache-purge
Referencia completa de directivas
-
Módulo PageSpeed
Capa de optimización adicional