Migrar Apache de Raspberry a Ubuntu

En este artículo trasladamos la infraestructura WordPress + MySQL en Docker de una raspberry a Ubuntu! Sigue leyendo y no te lo pierdas!

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:

herramienta-agnostics-raspberry
Herramienta agnostics
test-agnostic-rendimiento-tarjeta-sd-en-raspberry
Probando velocidad tarjeta SD
resultado-diagnostico-test-tarjeta-sd-raspberry
Resultado test velocidad SD raspberry

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:

rendimiento-de-la-web-en-escritorio-page-speed-insight
Test velocidad google desktop
rendimiento-de-la-web-en-movil-page-speed-insight
test velocidad google movil

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.

puntuacion-gtmetrix-velocidad-sitio-web
Puntuación del sitio en GTMetrix

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:

instalando-lubuntu-balena-etcher
Instalando Lubuntu en pendrive

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

instalando-lubuntu-en-el-nuevo-servidor
Instalando LUbuntu

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:

configuracion-interfaces-de-red-linux
Configuración interfaces de red

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

estableciendo-ip-fija-eth0-linux
Estableciendo ip fija para ethernet

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:

docker-compose-wordpress-mysql
Docker-compose wordpress y mysql

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:

docker-compose-up-descargando-imagen-wordpress-mysql-levantando-contenedor
Levantando contenedores con docker-compose

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

wordpress-mysql-apache-docker-ubuntu
WordPress levantado con docker

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

ejecutar-consola-dentro-de-contenedor-docker
Obtener consola en contenedor

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.

mysqldump-exportar-base-de-datos
Exportando base de datos con mysqldump

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

sacar-fichero-de-contenedor-docker-con-cp
Copiando fichero desde contenedor docker

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

copiar-base-de-datos-por-scp-ssh
Copiar fichero por scp ssh

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

introducir-fichero-en-docker
Copiar fichero en contenedor docker

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;

conectando-a-mysql-desde-consola
Conectar a mysql desde consola
mostrar-tablas-mysql-desde-consola
Obtener listado de tablas mysql desde consola

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

copiando-fichero-tar-con-scp
Copiar fichero tar por ssh con scp

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

descomprimir-fichero-tar-wordpress
Descomprimiendo .tar con tar -xf

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.

wordpress-migrado-localhost
WordPress migrado correctamente

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!