Reparar: Drupal 8 o 9 muy lento en Windows

Si tenemos instalado Drupal en un entorno de desarrollo en Linux este se ejecuta de maravilla incluso en una máquina virtual con 1 GB de RAM y 1 núcleo CPU. Cuando nos pasamos a Windows la cosa cambia drásticamente, incluso con 16 GB de RAM y 6 núcleos de CPU todo parece ir muy lento, con tiempos de espera en promedio de 5 segundos, al menos para un entorno de desarrollo, que es para lo único que es aceptable correrlo en Windows. Este problema no es nada nuevo, se viene arrastrando desde la adopción de IPv6 por parte de Windows 7. No entraré en detalles acerca de cuál es la causa y me concentraré en dar la solución.

drupal logo 2020

1. Configuración actual

  • Drupal 9
  • MariaDB 1.5
  • PHP 7.4
  • Nginx 1.14
  • PHP opcache
  • Laragon 5

Si usáramos una máquina virtual con Linux dentro de Windows no tendríamos el problema, pero por facilidad se optó por usar Laragon, pero en este caso en específico sería el mismo resultado con XAMPP, WampServer o WPN-XM.

2. Solución

2.1. Modificaciones en Windows

Primero tenemos que modificar nuestro archivo hosts en la ruta C:\Windows\system32\drivers\etc\hosts, y verificar que se encuentre una línea con lo siguiente:

127.0.0.1    localhost

Pueden existir varias líneas con 127.0.0.1, no hay ningún problema.

2.2. Modificaciones en Drupal

Después en nuestro archivo de configuración del sitio de Drupal, que normalmente es [raiz]/web/sites/default/settings.php o [raiz]/web/sites/default/settings.local.php, modificamos el campo "host" de nuestra base de datos y le colocamos el valor "127.0.0.1", es muy importante este paso, en Linux lo recomendado es usar "localhost", pero no en Windows.

Como extra y altamente recomendado, me di cuenta de que el módulo BigPipe del núcleo de Drupal no funciona muy bien en Windows y que al desactivarlo nos ganamos unos segundos extras, al menos en un entorno de desarrollo nativo en Windows, la cosa sería muy diferente en una máquina virtual con Linux.

2.3. Modificaciones en MySQL o MariaDB

Por último, modificamos el archivo de configuración de MySQL o MariaDB, normalmente nombrado my.ini, bajo la sección [mysqld] agregamos o modificamos los siguientes valores:

[mysqld]
#...
#...
skip-name-resolve
bind-address=*

Para tener un poco más de seguridad recomiendo bloquear el puerto 3306 o el que estemos usando para MySQL, para evitar que puedan conectarse de forma remota. La directiva "skip-name-resolve" desactiva la resolución de DNS cada que un cliente se conecta, y "bind-address" nos permite conexiones desde cualquier dirección IP. No hay que olvidar que tenemos que reiniciar MySQL o MariaDB con nuestro gestor de paquetes o en los servicios de Windows.

3. Conclusiones

Si bien este problema no es nuevo y al mismo tiempo no es grave, una de las cosas que si ha tomado importancia en los últimos años es el rendimiento de las aplicaciones web, porque podríamos decir que esperar unos segundos no es nada mientras desarrollamos, pero 5 segundos ya es una tortura, y aunque en este caso Drupal use una caché interna, el problema sigue existiendo solo que de forma oculta o al menos únicamente para los usuarios del área de administración. Me tomé la molestia de escribir esta entrada porque luego de tener bastantes problemas intermitentes con Vagrant, decidí usar algo más práctico y menos propenso a errores como lo es una aplicación nativa y no virtualizada. Aclaro que no tengo nada en contra de la virtualización, al contrario, lo ideal es tener un entorno de producción y desarrollo lo más parecido posible incluso a nivel del sistema operativo.