Cómo acelerar Drupal con las cachés adecuadas: OPcache, APCu y un backend compartido (Redis o Memcached)
Si tu sitio Drupal se siente lento, la caché suele ser la solución. Sin embargo, no es una única solución. Diferentes capas resuelven diferentes problemas. Por eso OPcache, APCu y un backend compartido como Redis o Memcached a menudo aparecen juntos. Cada uno acelera una parte específica de la pila. Úsalos bien y Drupal se vuelve ágil. Úsalos mal y seguirá arrastrándose.
Advertencia: elige un backend compartido para los bins de caché de Drupal. Usa Redis o Memcached, no ambos para los mismos bins.
De un vistazo: imprescindible vs avanzado
- Imprescindible: Habilita OPcache en PHP. Activa APCu para cachés locales. Elige un backend compartido para los bins en configuraciones multiseridor.
- Avanzado: Mapea bins específicos, ajusta los tiempos de espera del cliente Redis, modifica el tamaño de los elementos de Memcached, comprime valores grandes de Redis, dimensiona los pools según el uso real.
Guía rápida de decisión
Configuración | Imprescindible | Backend compartido | Mejor para | Notas |
---|---|---|---|---|
Servidor único | OPcache + APCu | Opcional | Sitios pequeños en un nodo | La caché de la base de datos puede ser suficiente. Añade Redis o Memcached si el tráfico aumenta. |
Múltiples servidores | OPcache + APCu | Redis o Memcached | Clusters balanceados por carga | Utiliza un backend compartido para render, dynamic page cache, page, default, data. |
Contenido de alta variabilidad | OPcache | Redis | Etiquetado e invalidación complejos | Las estructuras y las opciones de persistencia ayudan. |
Ligero y simple | OPcache | Memcached | Caché pura con mínima sobrecarga | Muy rápido, efímero por diseño. |
Qué hace cada caché
- OPcache: Acelera el propio PHP almacenando en caché los scripts compilados.
- APCu: Caché local de clave-valor por servidor para búsquedas pequeñas.
- Redis: Almacén de datos compartido en memoria para cachés, colas, bloqueos, sesiones.
- Memcached: Caché de clave-valor compartida en memoria, muy simple y rápida.
Cómo encajan en Drupal
- OPcache: Habilítalo en la capa de PHP. No es un módulo de Drupal.
- APCu: Sirve cachés locales y datos de arranque.
- Redis o Memcached: Mapea render, dynamic page cache, page, default, data al backend compartido. También soporta sesiones, bloqueos y colas.
Relacionado: Caché de estado (Drupal 10.3+, activada por defecto en Drupal 11). Consulta la publicación separada para más detalles: Acelera el backend de Drupal con $settings['state_cache']
.
Consejo profesional: En configuraciones multiseridor, mantén el arranque en APCu para una latencia ultrabaja y mueve el resto al backend compartido.
Recetas rápidas de settings.php
Pega y adapta.
Redis
Integración con Drupal
$settings['container_yamls'][] = 'modules/contrib/redis/redis.services.yml';
$settings['redis.connection']['interface'] = 'PhpRedis';
$settings['redis.connection']['host'] = '127.0.0.1';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
$settings['cache']['bins']['render'] = 'cache.backend.redis';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.redis';
$settings['cache']['bins']['page'] = 'cache.backend.redis';
Ajuste de rendimiento
// Compresión opcional
$settings['redis_compress_length'] = 100;
$settings['redis_compress_level'] = 1;
// Tiempos de espera del cliente (PhpRedis)
$settings['redis.connection']['timeout'] = 1.0;
$settings['redis.connection']['read_timeout'] = 1.0;
$settings['redis.connection']['retry_interval'] = 100;
$settings['redis.connection']['persistent'] = TRUE;
- container_yamls: Registra los servicios de Redis.
- interface: Elige el cliente. PhpRedis es una extensión nativa.
- host/port: Especifica el destino de la conexión. Prefiere sockets Unix en el mismo host.
- cache.default: Establece el backend por defecto para los bins no mapeados.
- bins: Mapea bins específicos a Redis.
- compress_length/level: Comprime valores grandes para ahorrar memoria.
- timeouts/persistent: Establece tiempos de espera de conexión/lectura y reutiliza conexiones.
Memcached
Integración con Drupal
$settings['container_yamls'][] = 'modules/contrib/memcache/memcache.services.yml';
$settings['memcache']['servers']['127.0.0.1:11211'] = 'default';
$settings['memcache']['bins']['render'] = 'default';
$settings['memcache']['bins']['dynamic_page_cache'] = 'default';
$settings['memcache']['bins']['page'] = 'default';
$settings['cache']['default'] = 'cache.backend.memcache';
- container_yamls: Registra los servicios de Memcache.
- servers: Define la lista de servidores y el nombre del pool.
- bins: Mapea los bins a un pool.
- cache.default: Establece el backend por defecto para los bins no mapeados.
APCu para bins locales
// Requiere el módulo backend APCu
$settings['cache']['bins']['bootstrap'] = 'cache.backend.apcu';
- bootstrap: Mantiene los datos de arranque en caliente dentro del proceso para una latencia mínima.
Configuración en tiempo de ejecución/servidor (fuera de settings.php)
Configuración de PHP (php.ini)
OPcache
opcache.enable=1
opcache.enable_cli=0
opcache.memory_consumption=192
opcache.max_accelerated_files=16229
opcache.validate_timestamps=0
opcache.revalidate_freq=0
opcache.interned_strings_buffer=16
opcache.fast_shutdown=1
opcache.enable
: Activa OPcache para FPM o Apache.opcache.enable_cli
: Mantiene OPcache desactivado para CLI.opcache.memory_consumption
: Asigna un pool de memoria para scripts compilados.opcache.max_accelerated_files
: Establece el tamaño de la tabla hash.opcache.validate_timestamps
: Comprueba las marcas de tiempo de los archivos para detectar cambios. Establecer en 0 para despliegues de "compilar una vez".opcache.revalidate_freq
: Establece los segundos entre comprobaciones de marcas de tiempo cuandovalidate_timestamps
= 1.opcache.interned_strings_buffer
: Asigna memoria para cadenas compartidas.opcache.fast_shutdown
: Habilita un cierre de solicitud más rápido.
APCu
apc.enabled=1
apc.enable_cli=0
apc.shm_size=128M
apc.ttl=0
apc.gc_ttl=3600
apc.enabled
: Activa APCu para FPM.apc.enable_cli
: Mantiene APCu desactivado para CLI.apc.shm_size
: Establece la memoria compartida total.apc.ttl
: Establece el TTL por defecto para las entradas.apc.gc_ttl
: Establece el tiempo para mantener las entradas huérfanas.
Servidor Redis (redis.conf)
maxmemory 2gb
maxmemory-policy allkeys-lru
timeout 1
tcp-keepalive 60
maxmemory
: Establece el límite de memoria.maxmemory-policy
: Establece el comportamiento de desalojo cuando está lleno.timeout
: Establece el tiempo de espera del cliente inactivo en segundos.tcp-keepalive
: Establece el intervalo para las sondas de keepalive.
Servidor Memcached (flags)
memcached -m 2048 -I 4m -f 1.25 -o slab_reassign,slab_automove
-m
: Establece la memoria total en MB.-I
: Establece el tamaño máximo del elemento.-f
: Establece el factor de crecimiento para las clases de slab.-o slab_reassign,slab_automove
: Habilita el reequilibrio de slab.
Reglas rápidas de dimensionamiento
Caché | Configuración clave | Regla rápida (MB) |
---|---|---|
OPcache | opcache.memory_consumption | MB = (código_base_MB × 3) + 32 |
OPcache | opcache.max_accelerated_files | ≈ 1.5 × archivos PHP (usa 10000, 16229, 32531) |
APCu | apc.shm_size | MB ≈ (claves × (bytes_elemento_promedio + 100) × 1.2) ÷ 1,000,000 |
Redis | maxmemory | MB ≈ (elementos × (bytes_elemento_promedio + 50) × 1.3) ÷ 1,000,000 |
Memcached | -m | MB ≈ (elementos × bytes_elemento_promedio × 1.3) ÷ 1,000,000 |
Memcached | -I | Empieza con 4 MB; aumenta si es necesario |
Mitos comunes
- Mito: OPcache almacena en caché HTML — Verdad: Almacena en caché código PHP compilado.
- Mito: APCu funciona entre servidores — Verdad: Es local a un proceso de servidor.
- Mito: Redis es siempre mejor que Memcached — Verdad: Elige según las necesidades.
- Mito: Los fallos de caché significan que algo está roto — Verdad: Los fallos ocurren y se calientan con el tráfico.
Lista de verificación rápida de configuración
- OPcache:
- Habilita la extensión en PHP.
- Ajusta el tamaño de la memoria y la configuración de revalidación para producción.
- Asegúrate de que
opcache.memory_consumption
sea suficiente para contener tu base de código.
- APCu:
- Instala la extensión PHP.
- Confirma la configuración de CLI y FPM si ejecutas ambas.
- Dimensiona
apc.shm_size
con margen para evitar desalojos.
- Redis:
- Instala el servidor y la extensión PHP.
- Añade el módulo Redis de Drupal y mapea los bins de caché correctos.
- Establece tiempos de espera del cliente y considera sesiones, bloqueos y colas.
- Memcached:
- Instala el servidor y la extensión PHP.
- Añade el módulo Memcache de Drupal y mapea los bins que desees.
- Establece
-I
para el tamaño máximo del elemento; asegúrate de que la aplicación tolere la pérdida de caché.
Evita estas trampas
- Evita mezclar Redis y Memcached para el mismo bin.
- Evita el subdimensionamiento de las cachés. Observa los desalojos y la tasa de aciertos.
- Evita el exceso de caché. Céntrate en datos costosos y reutilizables.
- Evita romper la invalidación. Respeta las etiquetas y contextos de caché.
Cómo medir el éxito
- Tendencias del tiempo de respuesta: El tiempo hasta el primer byte debería disminuir después del calentamiento.
- Carga de la base de datos: Menos consultas por solicitud y menor CPU en la base de datos.
- Ratio de aciertos: Rastrea las tasas de aciertos de caché. Si las tasas de aciertos se mantienen bajas, revisa el mapeo de bins y los TTL.
- Registros de errores: Observa los errores de conexión o los tiempos de espera de Redis o Memcached.
Pensamientos finales
Empieza con OPcache, añade APCu, luego Redis o Memcached para los bins compartidos. Mantenlo simple, mide los resultados y ajusta.