Llevo unos cuantos días sin escribir nada, pero es que intento sacar tiempo de debajo de las piedras y no hay manera. A ver si no pierdo las buenas costumbres y puedo seguir escribiendo más a menudo. El caso es que estoy revisando uno de los servidores que administro, para actualizarlo a la última versión, y optimizarlo tanto en costes como en rendimiento. Así que aquí estoy de nuevo compartiendo este sencillo HOWTO para migrar un servidor completo con Virtualmin.
Primero que todo tengo que presentar a Virtualmin para el que no lo conozca, es un panel de control del tipo Cpanel o Plesk. Funciona muy bien y tiene una versión gratuita con la que puedes tener correos electrónicos, antivirus, anti-spam, fail2ban, SSH, FTP, servidor de páginas web Apache, Mariadb, Mysql, Postgress, servidor de DNS.. etcétera.
Virtualmin es un panel de control desarrollado en Perl con el que puedes administrar tu servidor de alojamiento de páginas web de forma profesional. Es decir, no es que necesites de un panel de control para administrar un servidor siempre. Depende mucho del proyecto, o parte del proyecto en que estés trabajando. Pero son muchas las configuraciones que hay que hacer para tener todos los servicios que una web necesita, así que con todo esto en mente, Virtualmin te puede ayudar mucho.
Iniciamos la migración, los TTL de los registros DNS
El primer truco del almendruco para los nuevos, para poder hacer las cosas rápido y sin cortes del servicio, es poner los TTL de los registros de los dominios a valores pequeños. Conviene bajarlos el día anterior a la migración.
Estos TTL son los Time To Live de los registros DNS. Es decir, si por ejemplo tienes la web jnjsite.com apunta a la IP 213.32.19.180, y tiene un TTL de 1 día. Los que se guarden este dato lo harán durante 1 día. Si estás migrando tu web debes bajarle el valor de todos los TTLs a pocos minutos el día anterior. Así entonces según cambies la IP a tu nuevo servidor el día de la migración, los visitantes iran casi inmediatamente al nuevo servidor.
Hay proveedores de servicios que no te permiten bajar el TTL por menos de 1 hora por ejemplo (3600), mientras que otros te dejan incluso ponerlo a cero. Si no cambias el TTL antes del proceso, a valores bajos, tendrás una ventana de problemas de tamaño del TTL, con unos visitantes que irán al servidor antiguo, y otros al nuevo.
Al tajo, migrando datos de Ubuntu 16 a 18
Primero que todo decir que oficialmente no sale Ubuntu 18 como compatible, pero a mi me ha funcionado. Así que inicio el proceso haciendo copia de todo, como root:
mkdir /root/backups
virtualmin backup-domain --dest /root/backups/ --all-domains --all-features --newformat --all-virtualmin
scp -r /root/backups root@ip.a.tu.servidor:/root/
Con esto ya tendrás en el nuevo servidor todo empaquetado y preparado para instalar.
Instalando Ubuntu Server 18.04 LTS y Virtualmin
Si es un servidor local tendrás que bajarte Ubuntu de la página oficial:
https://www.ubuntu.com/download/server
Si estás contratando el servidor en la nube de una empresa, simplemente hay que elegir el sistema operativo.
Lo siguiente es bajar Virtualmin e instalarlo en el servidor con los siguientes comandos siendo root de nuevo:
wget http://software.virtualmin.com/gpl/scripts/install.sh
chmod +x install.sh
./install.sh
Si todo ha ido bien ya lo tenemos todo instalado. Podremos acceder al panel de Virtualmin en el puerto 10000 del servidor y debemos ver algo como la imagen inicial del post.
Importando los datos en el nuevo servidor
Lo siguiente simplemente importa los datos de configuraciones de Virtualmin y los datos en sí de los hosts que tuvieras en el servidor antiguo:
virtualmin restore-domain --source /root/backups/virtualmin.tar.gz --all-virtualmin
virtualmin restore-domain --source /root/backups/ --all-domains --all-features
Esto también hay que ejecutarlo como root.
Algunos consejos para optimizar el nuevo servidor
Todo hay que decirlo, no todo es coser y cantar. Después de lo anterior, apuntando los dominios al nuevo servidor, ya deberían de funcionar todas las webs, pero no funciona igual recién instalado que una vez optimizado. Así que manos a la obra, aquí dejo algunas mejoras que me han funcionado bien:
- Configura PHP en vez de como módulo de Apache2, como servicio FPM. Con ésto PHP lo ejecutará un servicio independiente. ¡Esto se nota mucho!
- Configura los valores por defecto de /etc/php/7.2/apache2/php.ini que son los globales.
- Configura los valores por defecto de /etc/php/7.2/fpm/php.ini que son los finales. Estos valores están limitados por los que pones en el directorio de configuración anterior, el de Apache.
- Virtualmin no te instala un fichero de intercambio de memoria, el fichero swap. Para esto me remito a otra sección más abajo.
- Si tienes un servidor pequeño (1 CPU, 1 GB RAM), te recomiendo que prescindas de SpamAssasin, ClamAV y fail2ban.. ya que consumen muchos recursos de memoria y CPU.
Configuraciones modificadas de PHP
Lo suyo es leerse la documentación oficial de Apache y PHP por lo menos. La idea es ir configurando estos servicios mientras que le vas haciendo pruebas de extrés a ver cuántos visitantes concurrentes aguanta..
Con la configuración de Apache por defecto no me funciona mal, y con la configuración para PHP le he modificado lo siguiente y de momento es suficiente para mi caso:
max_input_nesting_level = 640
max_input_vars = 10000
memory_limit = 2G
post_max_size = 20M
upload_max_filesize = 20M
session.cookie_lifetime = 300
opcache.enable=1
Esto se configura en los ficheros /etc/php/7.2/apache2/php.ini y en el /etc/php/7.2/fpm/php.ini. Hay que configurar ambos porque el de Apache limita los valores para el de FPM.
Podemos crear el fichero /myphpinfo.php con lo siguiente para ir probando si se aplican las configuraciones realmente:
<?php phpinfo();
Cómo crear el fichero de intercambio o swap
Para esto basta con ejecutar como root lo siguiente. Cambia el tamaño o nombre del fichero si quieres:
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon --show
nano /etc/fstab
Con el último comando abrirás el editor de particiones, en donde hay que añadir la partición swap, que es el fichero de intercambio o también llamado fichero de swap. Así que añadimos:
/swapfile none swap sw 0 0
Fuentes, bibliografía
https://www.virtualmin.com/
https://www.ubuntu.com/
https://www.php.net/manual/es/intro.fpm.php
https://httpd.apache.org/
https://www.google.com/