Usar Redis para acelerar Wordpress

Hoy toca nardopost para webmasters porque estuve trabajando en algo por el estilo la semana pasada.

Y como soy yo, mejor transmitir el conocimiento y que quede para el resto porque después me olvido y termino googleándolo por ahí 😁 y hasta me he encontrado a mí mismo posteando por algo que después quería saber.

En este caso voy con Redis, un sistema     que permite cachear en memoria consultas repetidas a una base de datos, algo muy común en todo CMS y muy importante en particular en Wordpress que hace un uso horrible de la base de datos.

Detalle: en este blog ni hace falta porque está bien programado, pero no nos pongamos así de pesados 😛

Por qué

Primero que nada hay dos formas de programar la relación entre un software y una base de datos, una es armando cuidadosamente cada consulta y otra es dejando que un framework se encargue de hacerlo por su cuenta.

Laravel es un ejemplo de esto último, muchos le "piden" y la base "da", pero el programador no tiene ni puta idea de lo que sucede del otro lado. Wordpress hace lo mismo, mete todo donde se le canta, no hace un uso muy prolijo de las tablas que tiene y, a la larga, se vuelve muy pesado por tener un diseño demasiado "universal".

Eso sí, es como una navaja suiza, te permite implementar de todo, el problema del tamaño también va de la mano de la repetición de consultas.

Ejemplo simple: en un blog como Tecnogeek.com tan sólo entrar al menú de administración de Wordpress implica 94 consultas distintas, 77  SELECT, 4 SHOW, 10 UPDATE, 2 INSERT, 1 DELETE. Si, todo eso para mostrar un puto dashboard si no entrás muy seguido, sino serán unos 50 en total, depende los plugins que uno tenga instalados.

Si de esas consultas cacheáramos la mayoría ¿Qué cambiaría? Pues mucho el tiempo de respuesta, una página que tarda 3-4 segundos en armarse puede pasar fácilmente a menos de un segundo.

Doy el ejemplo de Tecnogeek porque es como mi banco de pruebas, he hecho allí todo lo que luego terminé instalando en un cliente o en mi laburo habitual. Obvio que tengo cachés diversos, caché de archivos, caché de páginas, tengo OPcaché para PHP, pero hay otra cosa que no debe faltar: Redis.

Redis

Redis es un software libre que asocia una key a un string, sólo eso, al tenerlo en memoria entregarlo es mucho más rápido. Esa key es lo único que necesita para inmediatamente tener un resultado, cuando no existe, se hace la consulta a la DB, cuando llega la respuesta se guarda key-string y podemos reutilizarlo.

Esto funciona particularmente bien cuando la misma consulta, con los mismos resultados ,se hace cientos de veces por segundo. Algo bastante común en casi todo sitio web. Las interacciones que requieren guardar o actualizar se pasan de largo, pero las de consulta, que son las más usadas, se reciclan y se usa la key.

Redis ofrece esto, es pequeño, ocupa poco espacio en memoria, anda rápido y es fácil de implementar en Wordpress. La diferencia que he notado en algunos sitios es sustancial ,especialmente para el usuario final que es quien más acciones repetidas realiza, el admin notará un cambio también pero no tan fuerte.

Instalación

El server

No hay muchos misterios aquí, Redis es un paquete habitual en casi todas las distros de Linux, aunque no todos los proveedores de hosting te dan uno con esto instalado o funcionando (si estás en un servidor compartido, consultáGuiño.

En el caso de los que usamos VPS es simple:

sudo apt-get install redis-server

y después se lo instala como servicio:

sudo systemctl enable redis-server.service

Se puede configurar un poco para adaptarlo a las características del servidor, especialmente en el uso de RAM:

sudo nano /etc/redis/redis.conf

editando:

maxmemory 256mb
maxmemory-policy allkeys-lru

y luego se reinicia:

sudo systemctl restart redis-server.service

Hay que instalar la extensión de PHP para Redis con un simple comando:

sudo apt-get install php-redis

Para obtener info:

redis-cli info
redis-cli info stats
redis-cli info server

Esto lo saqué de aquí

En Wordpress

Del lado de Wordpress es fácil, buscan el plugin Redis Object Cache, lo instalan, lo activan. Esto no hará que funcione todavía, simplemente hay que dar un click en un botón para que eso suceda.

Si no tocan el archivo de configuración asumirá cosas básicas, usualmente para un sitio único en un servidor esto basta, si, en cambio, tienen más sitios, es un peligro activar sin configurar. Sigan leyendo.

Lo básico en el wp-config.php

El servidor de Redis, si está en el mismo host, será 127.0.0.1, si es otro, hay que indicarlo:

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );

También puede tener un password:

define( 'WP_REDIS_PASSWORD', 'secret' );

Y se le puede definir el timeout por si anda muy saturado, esto hará que salte directo a una consulta a la DB:

define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );

La base de datos

Es clave configurar esto si hay más de un sitio en un mismo servidor, no me refiero a la base de datos de MySQL sino a la interna de Redis, si tenés dos o tres sitios hay que indicar con un número único (para cada sitio) cual será su set de datos:

define( 'WP_REDIS_DATABASE', 0 );
define( 'WP_REDIS_DATABASE', 2 );

Obviamente esto lo descubrí cuando al segundo sitio de un servidor le puse Redis sin aclarar esto y... de pronto... el contenido se repetía entre uno y el otro 😋. Nadie te avisa de estas cosas!

otros parámetros (opcionales)

No existe un sólo cliente de Redis, si no saben qué instalar ni lo aclaren, usualmente es PHPRedis si lo instalaron en Ubuntu siguiendo pasos normales, hay otros:

// supported clients: `phpredis`, `credis`, `predis` and `hhvm`
define( 'WP_REDIS_CLIENT', 'phpredis' );

También se le puede indicar que limpie los datos cada X tiempo:

// automatically delete cache keys after 7 days
define( 'WP_REDIS_MAXTTL', 60 * 60 * 24 * 7 );

Y desactivar sencillamente:

// bypass the object cache, useful for debugging
define( 'WP_REDIS_DISABLED', true );

Hay más detalles que se detallan en la página de Github del plugin.

Se te enciman los usuarios? Solución

Mi escenario de la semana pasada era un poco más complejo que un simple blog: un sitio de e-learning que utiliza el LMS Learndash, bien pesado, miles de usuarios, y miles de usuarios haciendo cosas al mismo tiempo.

Esto implica que si Redis cachea mal algunas cosas se van a solapar las respuestas para distintos usuarios, algo inaceptable.

Por suerte se pueden exceptuar algunos grupos de datos de la caché de objetos de Redis, estas exclusiones no te las dice nadie en ningún lado hasta que uno se avivó que en el plugin pago de WooNinjas las tenían expuestas en un screenshot 😁

Al parecer los grupos que hay que dejar afuera son:

comment
counts
plugins
learndash_reports
learndash_admin_profile
wc_session_id

Para esto tenemos el parámetro WP_REDIS_IGNORED_GROUPS que se agrega en el wp-config.php de esta manera:

define( 'WPREDISIGNOREDGROUPS', [ 'comment', 'learndashreports', 'learndashadminprofile', 'wcsessionid', ], ); 

Los de WooNinjas simplemente tomaron el plugin de Redis normal y le agregaron un par de cosas para que Learndash funcione sin problemas y los usuarios no se encimen, el truco era agregar esos grupos en particular a las excepciones.

Validar y otras opciones

Suelo utilizar Query Monitor para ver si anda todo bien o no en mis sitios con WP, en este plugin podrás ver si se está usando el Object Cache (Redis) y cuántos aciertos tuvo (significa que ya lo tiene en Redis y no tuvo que ir al MySQL).

Aquí vamos a poder ver las estadísticas y tiempos de carga, antes de empezar todo este asunto puede servir para controlar.

Hay otras opciones para usar Redis, una es con el plugin W3 Total Cache, que te permite un nivel más detallado de qué cosas uno le autoriza a cachear. El único problema con ese plugin es que no vi nada que hablara de las excepciones (posiblemente sirvan las mismas configs, ni idea, todos le roban al original), y al tener versión paga es un caos lleno de anuncios para venderte la versión Premium.

La diferencia de velocidad no es algo que se note mucho si lo que estás buscando es una web que se renderice rápido, a veces se confunden las cosas, esto sirve para que la generación del html no se lleve demasiado tiempo en acciones repetidas.

Pero si tu sitio hace cosas distintas cada vez, Redis tampoco solucionará todo, posiblemente tengas que apelar a otra estrategia.

En el general, la combinación de caché de archivos, caché de objetos, op cache (operaciones php cacheadas) y evitar plugins inservibles o fácilmente reemplazables con una línea de código propia, son mucho mejores.


PS: la imagen de portada la hice con MidJourney simplemente pidiéndole "Redis Object Cache" y me dio esa especie de infografía isométrica con los colores correctos de Redis 😅

Si te gustó esta nota podés...
Invitame un café en cafecito.app


Otros posts que podrían llegar a gustarte...

Comentarios

  • Jonathan     02/05/2023 - 10:16:52

    Pensé que no usabas CMS en tus webs.

    Hay un servidor web desarrollado para Wordpress llamado OpenLiteSpeed que trae soporte integrado para cache bastante configurable, un dashboard y algunas boludeces más. Más rápido que todas las otras combinaciones de Webserver + Addon de cache que probé.

    Rant: Que chotos son los temas de Wordpress, compramos 2 en el trabajo y vienen con mil problemas:
    - Te repiten las consultas un montón de veces en la misma página para generar versiones del menú que no se muestran en ningún lado.
    - El principal levantaba las más de 7000 notas que teníamos en memoria (lo que hacia que las consultas fallaran y el server se colgara) para generar un filtro para Elementor que no se usaba y lo hacía en todas las putas páginas.
    - Repiten las solicitudes para archivos css.
    - Dependen de un millón de addons.

    Me tuve que pasar varios días editandolos para que no se colgaran la webs y tuvieran un rendimiento aceptable.

    • Fabio Baccaglioni     02/05/2023 - 11:08:13

      y cómo no voy a usar CMS?! :P uso el propio acá nada más. En un hosting tienen OpenLiteSpeed y lo uso, aun así no noté graaaan diferencia.

      Lo de los themes es así, por eso en mi laburo se arman todos a mano, para evitar eso, aun así es el mismo wordpress el que comete más pecados que cualquiera.

      Elementor lo odio en todo sentido :D

      Una vez que encontrás un template bueno, terminás haciendo todos los sitios con el mismo porque no te trae esos problemas, jeejeje

    • Fernando     02/05/2023 - 11:28:20

      Elementor es odioso y tedioso. Lento por todos lados.

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https

Negrita Cursiva Imagen Enlace


Comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador. Los comentarios son filtrados por ReCaptcha V3.