Configurar un sistema de caché en memoria como Redis es uno de los pasos más efectivos para acelerar plataformas exigentes como WordPress y Moodle. Sin embargo, lo que parece una instalación rutinaria de pocos comandos puede convertirse en un laberinto de diagnósticos confusos cuando el entorno del servidor maneja múltiples versiones de PHP de forma simultánea.
Recientemente me enfrenté a este escenario exacto mientras optimizaba un servidor VPS administrado con Virtualmin. Aunque las herramientas de diagnóstico por línea de comandos (CLI) aseguraban que todo estaba en orden, las aplicaciones web se empeñaban en ignorar la existencia de Redis. Esta es la bitácora de cómo desarmé el problema paso a paso, desde los conflictos de alias en Systemd hasta la discrepancia oculta de versiones de PHP.
1. El síntoma inicial y el despiste de la consola
El objetivo inicial era simple: habilitar el almacenamiento en caché de objetos mediante Redis para un sitio WordPress y, posteriormente, integrarlo en una plataforma Moodle 4.0.12. Tras realizar la instalación básica de los paquetes en el servidor, el plugin de WordPress seguía reportando que Redis no estaba habilitado.
Mi primera reacción fue verificar si el módulo de PHP estaba cargado ejecutando el clásico comando de diagnóstico:
php -m
La salida del comando listaba claramente el módulo:
[PHP Modules]
...
readline
redis
Reflection
...
Con el módulo aparentemente activo en PHP, el foco de la sospecha se trasladó al propio servicio de Redis.
2. El primer tropiezo: El servicio de Redis y los alias de Systemd
Al comprobar el estado del servicio de Redis, descubrí que estaba completamente inactivo:
root@web:~# sudo systemctl status redis
○ redis-server.service - Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Intenté iniciar y habilitar el servicio para que arrancara automáticamente con el sistema, pero Systemd rechazó la instrucción de habilitación:
root@web:~# sudo systemctl enable redis
Failed to enable unit: Refusing to operate on alias name or linked unit file: redis.service
redis.service suele ser un alias o un enlace simbólico apuntando a la unidad real, que es redis-server.service. Systemd rechaza operaciones de habilitación (enable) sobre alias para evitar inconsistencias.
La solución para este primer escollo fue interactuar directamente con el nombre del servicio real:
sudo systemctl start redis-server
sudo systemctl enable redis-server
Tras esto, una prueba rápida con la herramienta de línea de comandos confirmó que el motor de base de datos en memoria estaba respondiendo perfectamente:
root@web:~# redis-cli ping
PONG
Con Redis activo, WordPress finalmente reconoció la caché de objetos. Sin embargo, el verdadero desafío comenzó al intentar replicar el éxito en Moodle.
3. El laberinto de Moodle y el misterio de "Add Instance"
Al ingresar a la administración de caché de Moodle 4.0.12 (Administración del sitio → Plugins → Caché → Configuración), me encontré con una pared: la sección de Redis aparecía listada en la tabla de almacenes de caché (cachestores), pero a diferencia de la caché de archivos (File cache), no mostraba la opción "Add instance" (Agregar instancia). Solo permitía configurar un "Servidor de pruebas" (Test server), lo cual no habilita el uso real en producción.
Pensando que se trataba de un problema de registro del plugin, decidí clonar la rama correspondiente del almacén de caché de Redis directamente desde el repositorio oficial de Moodle:
cd /home/dosclic/domains/plataforma.dosclic.com/public_html/cache/stores/
git clone -b MOODLE_400_STABLE https://github.com/moodle/moodle.git redis
Posteriormente, ejecuté el script de actualización por CLI para forzar a Moodle a registrar el plugin:
php admin/cli/upgrade.php
El sistema procesó la actualización e indicó que el plugin cachestore_redis se había registrado con éxito. Sin embargo, al regresar a la interfaz web, la opción "Add instance" seguía sin aparecer.
4. Forzando la URL y el error ex_unmetstorerequirements
Decidí realizar un bypass visual. Observando la estructura de las URLs de Moodle, noté que el enlace para añadir un almacén de archivos era:
https://plataforma.dosclic.com/cache/admin.php?action=addstore&plugin=file
Especulé que si modificaba el parámetro del plugin directamente en la barra de direcciones del navegador, podría forzar la creación de la instancia de Redis:
https://plataforma.dosclic.com/cache/admin.php?action=addstore&plugin=redis
Al cargar la URL modificada, Moodle finalmente arrojó un error explícito que reveló la raíz del problema:
Error code: ex_unmetstorerequirements
Este error es una validación interna de Moodle. Significa que, aunque el código del plugin está presente, el entorno de ejecución de PHP no cumple con los requisitos mínimos para interactuar con Redis.
5. El punto de quiebre: La discrepancia de versiones de PHP (CLI vs Web)
Para aislar el problema, creé un script PHP de prueba muy sencillo (test_redis.php) en la raíz del sitio web para intentar instanciar la clase de Redis:
<?php
$redis = new Redis();
try {
$redis->connect('127.0.0.1', 6379);
echo "Conexión exitosa\n";
} catch (Exception $e) {
echo "Error: " . $e->getMessage() . "\n";
}
Al ejecutarlo desde la terminal, obtuve un error fatal inmediato:
root@web:/home/dosclic/...# php test_redis.php
PHP Fatal error: Uncaught Error: Class "Redis" not found in /home/dosclic/.../test_redis.php:2
¿Cómo era posible que la clase Redis no existiera si previamente php -m me había mostrado el módulo cargado? La respuesta la obtuve al rastrear la ubicación física de los archivos de configuración del módulo en el servidor:
root@web:~# find /etc/php/*/ -iname "*redis*"
/etc/php/8.5/phpdbg/conf.d/25-redis.ini
/etc/php/8.5/mods-available/redis.ini
/etc/php/8.5/cli/conf.d/25-redis.ini
El diagnóstico era definitivo:
- El comando
php -men la terminal se estaba ejecutando bajo PHP 8.5 (CLI), donde el módulo de Redis sí estaba instalado y configurado. - Sin embargo, el servidor web (configurado a través de Virtualmin) estaba sirviendo el sitio de Moodle utilizando PHP 8.0.
- En el entorno de PHP 8.0, la extensión
php-redisno existía en absoluto. Por esta razón, Moodle (corriendo bajo el servidor web con PHP 8.0) no detectaba el soporte de Redis y bloqueaba preventivamente la opción de añadir instancias.
6. La solución definitiva
Para resolver el problema, fue necesario instalar la extensión de Redis específicamente para la versión de PHP que el servidor web estaba utilizando para Moodle:
sudo apt install php8.0-redis
Una vez instalado el paquete, reinicié el servidor web Apache para que cargara la nueva configuración de PHP:
sudo systemctl restart apache2
Para verificar que todo estaba en orden, accedí a la herramienta interna de Moodle en https://plataforma.dosclic.com/admin/phpinfo.php. La sección redis finalmente apareció listada como activa.
phpinfo() o ejecutando scripts de prueba directamente desde el navegador.
Al regresar a la configuración de almacenes de caché en Moodle, el botón "Add instance" para Redis apareció habilitado de forma automática. Configuré la instancia apuntando a 127.0.0.1 en el puerto 6379, guardé los cambios y asigné Redis como el almacén principal para la caché de aplicaciones y sesiones.
Para la confirmación final, ejecuté el monitor de Redis en la terminal mientras navegaba por la plataforma:
root@web:~# redis-cli monitor
OK
1679234989.102345 [0 127.0.0.1:56721] "GET" "moodle_cache_application..."
1679234989.105678 [0 127.0.0.1:56721] "SET" "moodle_cache_session..."
El flujo de datos en tiempo real confirmó que Moodle estaba utilizando Redis de manera exitosa, reduciendo drásticamente los tiempos de carga y la carga sobre la base de datos MySQL.
La historia detrás de la nota
Este caso me recordó la importancia de no dar nada por sentado en entornos multi-PHP. Un simple comando CLI puede mentirte piadosamente si no estás ejecutando la misma versión que tu servidor web.