En este artículo trasladamos la infraestructura WordPress + MySQL en Docker de una raspberry a Ubuntu! Sigue leyendo y no te lo pierdas!
Índice de contenido
Motivación
Como ya viene siendo habitual, antes de explicar cualquier proceso en este blog, vengo hablando del por qué, cuáles son los motivos que me hacen llevar a cabo este ‘experimento’.
Actualmente tengo un servidor web con apache y mysql corriendo sobre docker en una Raspberry Pi, estos pequeños dispositivos son geniales en cuanto a eficiencia energética y ruido, para algo sencillo nos pueden dar el apaño perfectamente.
Sin embargo, últimamente estoy experimentando un bajón en la velocidad de carga en WordPress. Y uno de los motivos que me llevan a pensar que puede tener que ver con la raspberry es la velocidad de lectura / escritura de las tarjetas SD.
Probar la velocidad de una tarjeta SD en Raspberry
Con la sospecha rondándome, lo primero que hice fue intentar lanzar un test de velocidad a la tarjeta sd. Para ello, simplemente hemos de instalar la herramienta agnostics en nuestra PI:
sudo apt-get install agnostics
Y a continuación, abrir la herramienta y seguir el sencillo proceso:



Como se puede apreciar, por una parte el test termina con error, algo que no hace presagiar nada bueno, por otra, se nos presenta información de 3 tests no muy favorables, nos quedamos muy lejos de los umbrales de IOPS recomendados (Inputs and Outputs Per Second) en lo que se refiere a escritura aleatoria. Aunque no vamos del todo mal en las lecturas, en las escrituras tanto aleatorias como secuenciales estamos por los suelos.
Con estos resultados podríamos pensar que el pésimo rendimiento de nuestra web podría venir por la velocidad de lectura / escritura de la tarjeta, así que vamos a ver cuánto podemos mejorar si migramos el servidor.
Probando la velocidad del servidor antes de la migración
Para poder tener una vision clara de la mejora, y poder cuantificar los resultados del cambio, haremos uso de 2 herramientas, Google Page Insights y GTMetrix para tomar el pulso al rendimiento actual del sitio en cuanto a velocidad de carga.
Google Page Insights
Entramos en la web de google page insights e introducimos la dirección de nuestro sitio:


En general no tenemos mala puntuación, pero la respuesta inicial del servidor canta demasiado.
GTMetrix
Mismo procedimiento, entramos a la web de gtmetrix e introducimos la url de nuestro sitio.
Para no quedarnos solo con la métrica anterior y corroborar el resultado, realizamos la misma operación en GTMetrix, como podemos comprobar, el tiempo de respuesta del servidor necesita mucha mejora.

Migrar apache + mysql en docker de raspberry a LUbuntu
Llega la hora de remangarse y ponernos manos a la obra con la migración ; )
El nuevo servidor
¿Por qué Lubuntu? Simple, quiero tener el core de Ubuntu pero con una versión más liviana del entorno gráfico, la versión clásica de este sistema viene con el entorno Gnome3, el cual puede ser algo más pesado para equipos modestos, mientras que Lubuntu incorpora LXQt, una interfaz mucho más liviana.
Por otra parte, esta migración ha de cumplir una serie de requisitos, los cuales son:
– Hacer poco ruido
– Ocupar poco espacio
– Usar hardware modesto pero aún guerrero 💪
El servidor estará en la misma habitación donde trabajo, y, si de por sí ya tengo algún equipo encendido, no quiero otra “mosca zumbando” permanentemente.
Dispongo de algunos de equipos de sobremesa algo anticuados que podrían servirme, pero sus ventiladores son bastante ruidosos y las torres no son precisamente pequeñas, por lo que esta opción queda descartada hasta que en un futuro me haga con una caja de pc pequeña y unos ventiladores silenciosos.
Lo que me queda es un viejo portátil con un i3 de tercera generación (3217U), 8GB de RAM DDR3 y 500GB de HDD.
¡Estás loco! ¿Vas a montar un servidor en un portátil? Pues sí, cumple los requisitos mínimos de hardware, lo puedo tener encendido en una estantería de pared y a no ser que los ventiladores se revolucionen de vez en cuando, no hace demasiado ruido. Y qué demonios, aquí hemos venido a trastear 😎. Actualización: Al momento de escribir estas líneas he de decir que ya lo estoy probando como servidor. Cuando se está en absoluto silencio suena un poco, está claro que más que la raspberry puesto que esta no tenía disipación activa ni disco mecánico, pero es un ruido bastante aceptable.
Instalando LUbuntu
Para instalar Lubuntu lo primero que hemos de hacer es ingresar a la sección de descargas de la web oficial y bajarnos la imagen .iso.
En mi caso voy a descargarla via torrent, parece que el enlace directo al archivo da un 404. Una vez descargada, haremos uso de balena etcher para grabarla en un pendrive.
Seleccionamos la iso de origen, el pendrive de destino y esperamos a que finalice el proceso:

Ahora iniciaremos desde el pendrive en nuestro equipo y la instalación de LUbuntu comenzará, simplemente hemos de ir siguiendo los pasos.

Ahora pasemos a la configuración del sistema.
Establecer una ip fija en LUbuntu Linux
Para comenzar, vamos a establecer una IP fija para el equipo en la interfaz de red eht0, esto evitará que en algún reinicio se obtenga una dirección por DHCP distinta a la que está mapeada en el router para el servidor web.
Vamos a la consola y ejecutamos las siguientes instrucciones:
sudo nano /etc/network/interfaces
Nos aparecerá algo como esto:

Al final del fichero, añadiremos las siguientes líneas:
auto enp2s0
iface enp2s0 inet static
address 192.168.0.111
netmask 255.255.255.0
network 192.168.1.100
gateway 192.168.0.1
broadcast 192.168.0.255
dns-nameservers: 192.168.0.1

Con esta configuración estamos especificando que queremos asignar a la interfaz de red cableada, normalmente eth0 aunque en mi caso enp2s0 (puedes ver el nombre de tu interfaz ejecutando un ifconfig en consola) la ip estática terminada en 111.
La puerta de enlace (gateway) será la ip de nuestro router, mientras que la dirección 192.168.1.100 (network) es la dirección ip de nuestro router en la red principal de la que cuelga (192.168.0.x es una subred de 192.168.1.X).
Como siempre, estos valores dependerán de la ip que cada cual necesite.
Guardamos (Ctrl + O), salimos (Ctrl + X) y reiniciamos la red con:
sudo service networking restart
Migrando Docker
Llegados a este punto, podríamos no mantener docker, pero por la sencillez a la hora de levantar los servicios, instalar nuevos contenedores, etc, lo vamos a mantener. Vamos a instalarlo.
sudo apt-get install docker.io
Llegados a este punto, necesitaríamos migrar los contenedores de una máquina a otra, normalmente podríamos hacerlo con docker export / docker import tal y como se especificaba en la entrada que ya tenemos sobre cómo crear copias de seguridad de nuestros contenedores docker.
El problema viene cuando hemos de hacer la migración a una arquitectura de procesador diferente, he intentado migrar los contenedores con docker export / docker import. Solo las imágenes con docker save / docker load e incluso he sacado una instantánea del contenedor de la raspberry con docker commit y luego la he intentado importar en Ubuntu, y en todas las ocasiones he obtenido el mismo problema al levantar el contenedor:
standard_init_linux.go:211: exec user process caused «exec format error»
Vuelvo a repetir, intuyo que se debe a las diferentes arquitecturas de procesador, por lo que no nos queda más remedio que seleccionar imágenes para x64 y volver a configurarlo todo.
Crear los nuevos contenedores con docker-compose
Para este punto hemos de configurar el nuevo fichero docker-compose.yml, que tendrá un aspecto similar al siguiente, referenciando a imágenes de docker-hub:

Hay que señalar que los datos de las variables de conexión a base de datos de WordPress han de coincidir con los que pongamos en el contenedor de mysql.
Ahora ejecutaremos (en el directorio donde se encuentre el fichero):
docker-compose up
El sistema descargará las imágenes que necesite y levantará los dos contenedores:

En este punto ya podríamos acceder a nuestro wordpress, aún vacío, desde el navegador entrando a localhost:

Exportar base de datos Mysql con MysqlDump
Para llevar a cabo este proceso, hemos exportar un fichero .sql de la base de datos de la raspberry y después importarla en la base de datos del nuevo servidor.
Lo primero que haremos será obtener una shell en el contenedor docker de la raspberry:
docker exec -it docker_db_1 bash

Una vez tengamos la consola del contenedor, ejecutaremos mysqldump para obtener el fichero .sql:
mysqldump -u usuario -p base_de_datos > basededatos.sql
Si no tienes instalado mysqldump, suele estar disponible en el paquete mysql-client.

Con el parámetro -u especificamos el usuario, con el -p la base de datos y con > dirigimos la salida al fichero .sql
Listo, ahora hemos de sacar este archivo .sql del contenedor docker_db_1 hacia el anfitrión (Ejecutado desde raspberry).
docker cp docker_db_1:/basededatos.sql /home/pi/basededatos.sql

Ya tenemos nuestra base de datos volcada en un fichero .sql en la raspberry, ahora, conectándonos desde el nuevo servidor a la raspbery con scp (copia bajo ssh), la moveremos de la raspberry a ubuntu (Ejecutado desde el nuevo servidor):
scp pi@IP_ORIGEN:/home/pi/basededatos.sql /home/usuario/basededatos.sql

Importar base de datos MySQL
Una vez con el fichero sql en el nuevo servidor, hemos de realizar el proceso inverso, primero introducirlo en el contenedor, y después, importarlo en la nueva base de datos:
docker cp basededatos.sql escritorio_db_1:/root
docker exec -it escritorio_db_1 hash

Una vez listo el fichero en el contenedor que alojará MySQL del nuevo servidor, nos conectaremos a la base de datos mysql para importar los datos, desde la shell del contedor:
mysql -u usuario -p basedatos < basedatos.sql
mysql -u usuario -p
SHOW TABLES FROM basededatos;


Listo, base de datos terminada. Vamos ahora con el WordPress.
Migrando los archivos de WordPress
El siguiente punto sería migrar los ficheros de wordpress como tal, para ello, en el post sobre como realizar copias de seguridad de los contenedores, generábamos un fichero .tar con el contenido de /var/www/html, el cual guardábamos en un fichero wordpress_volumen.tar.
Vamos a mover este tar al nuevo servidor y lo descomprimiremos en /var/lib/docker/volumes/[contenedor]/_data/
scp pi@IP_ORIGEN:/home/pi/wordpress_volumen.tar /home/usuario/wordpress_volumen.tar

tar -xf wordpress_volumen.tar -C /var/lib/docker/volumes/contenedor/_data

Una vez finalizado el proceso, hemos de comprobar que se ha descomprimido correctamente.
Después de realizar esta tarea, aún nos quedan cosas pendientes como migrar los certificados SSL y configurar el host virtual de apache, o la configuración de las copias de seguridad. Sin embargo, viendo cómo he ido migrando los ficheros, y echando un ojo a algunas entradas del blog como estas:
Cómo instalar certificado SSL en WordPress
Copias de seguridad automáticas en Linux
podemos realizar el proceso sin dilatar mucho más este artículo, puesto que ya se han explicado.

Mejora de rendimiento en Page Speed Insight y GTMetrix ✔️
He de decir que, incluso antes de realizar la prueba en estas webs con el nuevo servidor, ya se notaba un rendimiento muy superior accediendo a la web, al panel de administración, etc. Por lo que podríamos dar el experimento por exitoso.
Al volver a pasar la web por GTMetrix ya no aparece el warning en rojo sobre el alto tiempo de respuesta, sin embargo en algunas ocasiones sí aparece en la herramienta de Google, quizás es cuando el disco mecánico está un poco “durmiendo” por inactividad. De todas formas, cuando aparece, nos marca unos 0.2 segundos menos que antes, todo lo que podamos rascar es bueno.
Como conclusión final, y dejando de lado los datos de estas herramientas, por los que no debemos regirnos al 100%, vuelvo a repetir que la experiencia de uso en la web es mucho más fluida y las páginas cargan mucho más rápido, algo muy beneficioso para el usuario y para Google, que lo valora mucho a la hora de rankear la web (aunque ahora mismo estemos en el subsuelo en cuanto a posicionamiento).
El próximo paso será sustituir el disco mecánico por un ssd.
Nada más por esta semana ; )
Un saludo!