Se recomienda realizar una previa lectura del post VirtualHosting con Apache, pues en este artículo se tratarán con menor profundidad u obviarán algunos aspectos vistos con anterioridad.
Tarea 1: Instalación de un servidor LAMP.
Un servidor LAMP contiene una unión de diferentes tecnologías, con la que podremos definir la infraestructura de un servidor web. Las tecnologías implicadas son las siguientes:
- Linux, el sistema operativo (en este caso, Debian Buster).
- Apache, el servidor web (en este caso, apache 2.4).
- MySQL/MariaDB, el gestor de bases de datos.
- PHP, el lenguaje de programación.
En este caso, vamos a tener un CMS (aplicación web de propósito general) escrito en PHP. Para servir dicho CMS necesitamos un servidor de aplicaciones capaz de interpretar dicho código PHP y convertirlo en HTML, un lenguaje legible por el navegador web. Además, necesitamos un servidor web que devuelva el HTML a los clientes tras las correspondientes peticiones. Para ello, vamos a utilizar apache2 como servidor web y gracias a un módulo que instalaremos, también lograremos la funcionalidad del servidor de aplicaciones, de manera que estará unificado en un único servicio. Éstas aplicaciones CMS guardan sus datos en una base de datos, es decir, el código PHP que se ejecuta, accede a la base de datos mediante llamadas a la misma, por lo que también necesitaremos un servidor de bases de datos.
Crea una instancia de Vagrant basado en un box Debian o Ubuntu.
Para ésta práctica, necesitaremos una máquina que actuará como servidora desde un primer momento y además, otra máquina a la que posteriormente moveremos la base de datos, de manera que en un principio tendremos toda la pila LAMP en la primera máquina y posteriormente, el servidor de bases de datos no será local, sino remoto.
La primera de ellas deberá tener una interfaz de red host-only (de manera que tenga conexión directa con la máquina anfitriona y podamos acceder a la misma desde el navegador) y una dirección dentro de una red interna, estando dentro de la misma red interna la segunda máquina (no es necesario que la segunda máquina tenga una interfaz host-only, pues no necesitamos acceder desde la máquina anfitriona). En este caso, el fichero de configuración Vagrantfile tiene la siguiente forma:
Tras ello, levantaremos el escenario Vagrant haciendo uso de la instrucción:
A continuación comenzará a descargar el box (en caso de que no lo tuviésemos previamente) y a generar las máquinas virtuales con los parámetros que les hemos establecido en el Vagrantfile. Una vez que haya finalizado el proceso, nos podremos conectar a la primera de ellas ejecutando la siguiente instrucción (pues todavía no es necesario configurar la máquina de backup):
Ya nos encontramos dentro de la máquina. Para verificar que las interfaces de red se han generado correctamente, ejecutaremos el comando:
Efectivamente, contamos con tres interfaces:
- eth0: Generada automáticamente por VirtualBox y conectada a un router virtual NAT, con dirección IP 10.0.2.15.
- eth1: Creada por nosotros y conectada a una red interna lan1, con dirección IP estática 172.22.100.2.
- eth2: Creada por nosotros y conectada en modo host-only al anfitrión, con dirección IP estática 192.168.50.2.
Instala en esa máquina virtual toda la pila LAMP.
Los paquetes que tendremos que instalar para cada una de las tecnologías implicadas son:
- Linux - Suponemos que ya se encuentra instalado.
- Apache - apache2 y libapache2-mod-php.
- MySQL/MariaDB - mariadb-client y mariadb-server.
- PHP - php y php-mysql.
Esos son los paquetes a instalar para tener una pila LAMP totalmente operativa, no sin antes upgradear los paquetes instalados, ya que el box con el tiempo se va quedando desactualizado. Para ello, ejecutaremos el comando (con permisos de administrador, ejecutando el comando sudo su -
):
Listo, todos los paquetes se encuentran ya instalados.
Tarea 2: Instalación de Drupal en mi servidor local.
Configura el servidor web con un VirtualHost para que el CMS sea accesible desde la dirección www.alvaro-drupal.org.
Para configurar un nuevo VirtualHost de apache2, debemos modificar el fichero de configuración /etc/apache2/apache2.conf, ejecutando para ello el comando (con permisos de administrador, ejecutando el comando sudo su -
):
Dentro del mismo, tendremos añadir una sección Directory en el que especificaremos el directorio padre dentro del cuál alojaremos los diferentes DocumentRoot, pues dichos DocumentRoot heredarán los permisos del mismo. En este caso, he decidido que dicho directorio padre sea /srv/, por lo que le he configurado algunas directivas estándar, quedando de la siguiente forma:
El directorio padre donde alojaremos los diferentes DocumentRoot ya se encuentra creado, pero todavía tenemos que generar dichos DocumentRoot. Para el caso de Drupal, el primer CMS que instalaremos, voy a generar un subdirectorio dentro de /srv/ de nombre drupal/, que será el DocumentRoot del VirtualHost que configuraremos a continuación, ejecutando para ello el comando:
Para verificar que el directorio se ha generado correctamente, haremos uso del comando ls
:
Efectivamente, el directorio se ha generado correctamente. Tras ello, únicamente nos queda crear el nuevo fichero de configuración dentro de /etc/apache2/sites-available/, así que nos moveremos a dicho directorio ejecutando el comando:
Una vez dentro del mismo, vamos a utilizar como plantilla el fichero de configuración del VirtualHost que trae apache2 configurado por defecto, 000-default.conf, así que copiaremos dicho fichero a uno de nombre drupal.conf (por ejemplo, aunque se podría haber usado cualquier otro nombre). Para ello, ejecutaremos el comando:
Para verificar que el nuevo fichero de configuración se ha generado correctamente, volveremos a ejecutar el comando ls
:
Como era de esperar, el fichero se encuentra generado, así que lo único que queda es realizar las modificaciones oportunas al mismo, tales como indicar www.alvaro-drupal.com como ServerName y /srv/drupal como DocumentRoot, ejecutando para ello el comando:
Esa sería la apariencia del fichero de configuración hasta ahora, así que únicamente nos queda habilitar el VirtualHost que acabamos de crear, ejecutando para ello el comando:
Como se puede apreciar en los mensajes devueltos, el sitio ha sido correctamente habilitado, pero para activar la nueva configuración, tendremos que recargar la configuración del servicio apache2, ejecutando para ello el comando:
Una vez que la configuración se ha vuelto a cargar, vamos a listar el contenido de /etc/apache2/sites-enabled para verificar que el correspondiente enlace simbólico ha sido correctamente creado. Para ello, ejecutaremos el comando:
Efectivamente, el nuevo VirtualHost se encuentra activo. Tras ello, volveremos a la máquina anfitriona y configuraremos la resolución estática de nombres en la misma, para así poder realizar la traducción del nombre a la IP de la máquina y que así podamos acceder, gracias a la cabecera Host de la petición HTTP. Para llevar a cabo dicha configuración, tendremos que modificar el fichero /etc/hosts, ejecutando para ello el comando:
Dentro del mismo, tendremos que añadir una línea de la forma [IP] [Nombre] para el nuevo sitio que hemos creado, siendo [IP] la dirección IP de la máquina servidora (en este caso 192.168.50.2) y [Nombre] el nombre de dominio que vamos a resolver posteriormente, de manera que la configuración final sería la siguiente:
Tras ello, podremos acceder al navegador e introducir el nombre de dominio para que se lleve a cabo la resolución estática de nombres, que tiene prioridad sobre las peticiones al servidor DNS, verificando así que el servidor apache2 se encuentra operativo y con el VirtualHost funcionando:
Como podemos apreciar, se ha podido acceder sin problema, ya que hemos realizado correctamente la configuración del ServerName en el fichero de configuración y a la hora de comparar la cabecera Host existente en la petición HTTP, ha encontrado coincidencia con dicho VirtualHost.
Crea un usuario en la base de datos donde se van a guardar los datos del CMS.
Lo primero que debemos hacer es acceder al servidor mysql, ejecutando para ello el comando (cuando nos pida una contraseña, no introduciremos nada, simplemente pulsaremos ENTER):
Donde:
- -u: Indica el usuario con el que nos vamos a conectar, en este caso, root.
- -p: Indicamos la contraseña, en este caso, no introducimos ninguna.
Una vez dentro del servidor de bases de datos, tendremos que crear una nueva base de datos, valga la redundancia. En este caso, para identificarla fácilmente, de nombre drupal. Para ello, ejecutamos el comando:
La base de datos que usará Drupal ya se encuentra creada, pero de nada nos sirve tener una base de datos si no tenemos un usuario que pueda acceder a la misma. En este caso, vamos a crear un usuario de nombre “username” que tenga permitido el acceso desde localhost (es decir, desde la máquina local) y cuya contraseña sea “usuario” (lógicamente, en un caso real se usarían credenciales más seguras). Para ello, haremos uso del comando:
El usuario ya ha sido generado, pero todavía no tiene permisos sobre la base de datos que acabamos de crear, así que debemos otorgarle dichos privilegios. Para ello, ejecutaremos el comando:
Una vez realizadas todas las modificaciones oportunas, podremos salir de mysql haciendo uso del comando:
Nota: No es necesario hacer uso del comando FLUSH PRIVILEGES;
, a diferencia de varios artículos que he estado leyendo en Internet, que usan dicho comando muy a menudo sin necesidad alguna. Dicho comando, lo que hace es recargar la caché de las tablas GRANT que se encuentran en memoria, recarga que se hace de forma automática al hacer uso de una sentencia GRANT, de manera que no es necesario hacerlo manualmente. Para aclararlo, dicho comando únicamente debe utilizarse tras modificar las tablas GRANT de manera indirecta, es decir, tras usar sentencias INSERT, UPDATE o DELETE.
Descarga la versión que te parezca más oportuna de Drupal y realiza la instalación.
En este caso, vamos a utilizar la última versión de Drupal (9.0.7), que podremos descargar desde la página oficial, concretamente desde aquí. Para ello, primero nos moveremos al DocumentRoot donde instalaremos Drupal, ejecutando para ello el comando:
Una vez dentro del mismo, haremos uso de wget
para descargar el paquete comprimido de Drupal desde dicha web:
Como curiosidad, si nos fijamos en los primeros mensajes, el enlace de descarga que hemos introducido realmente lo que tiene configurada es una redirección temporal (302) que apunta al paquete .tar.gz de la última versión disponible de Drupal (download-latest), de manera que cuando publiquen una nueva versión, cambian dicha redirección para que apunte al nuevo paquete.
Para verificar que el comprimido se ha descargado correctamente, haremos uso del comando ls -l
:
Efectivamente, se ha descargado un paquete de nombre “tar.gz” con un peso total de 16.08 MB (16863270 bytes).
Al estar comprimido el fichero, no podemos llevar a cabo la instalación hasta que no hagamos una extracción de los ficheros contenidos. Además, para liberar espacio, borraremos tras ello el fichero comprimido ya que no nos hará falta. Para ello, ejecutaremos el comando:
Donde:
- -z: Utiliza gzip para descomprimir el fichero.
- -x: Indica a tar que desempaquete el fichero.
- -f: Indica a tar que el siguiente argumento es el nombre del fichero .tar.gz.
- –strip 1: Saltamos el primer directorio, ya que dentro del comprimido hay un directorio padre que no necesitamos.
Para verificar que el fichero se ha descomprimido correctamente, haremos uso del comando:
Efectivamente, todo el contenido se ha descomprimido tal y como queríamos (en lugar de descomprimir un directorio de nombre drupal-9.0.7 del que posteriormente tendríamos que mover los ficheros contenidos al directorio actual).
Dado que hemos indicado también la opción -a, nos ha mostrado los ficheros ocultos (es decir, en Linux son aquellos que empiezan por .). Si nos fijamos, existe uno de nombre .htaccess, que nos hará falta más adelante.
Ya tenemos todos los ficheros necesarios para llevar a cabo la instalación de Drupal, pero hay un pequeño detalle que todavía no hemos contemplado, pues el usuario creador y el grupo correspondiente a dichos ficheros y directorios es root, cosa que jamás debe ocurrir ya que el usuario propietario por defecto a través del cuál se sirven las páginas web es www-data, por lo que procedemos a cambiar dicho propietario y grupo de forma recursiva, haciendo para ello uso del comando chown -R
, pues de otro modo no podría escribir en dichos ficheros durante la instalación:
Para verificar que el cambio se ha llevado a cabo correctamente, volveremos a listar el contenido de /srv, haciendo uso de ls -l
:
Como era de esperar, el usuario y el grupo propietario del directorio drupal/ se ha visto modificado, al igual que todos sus ficheros y directorios contenidos, al haberlo hecho de forma recursiva.
Ya está todo listo para llevar a cabo la instalación, así que volveremos a acceder al navegador de la máquina anfitriona y escribiremos el nombre de dominio previamente configurado, www.alvaro-drupal.com:
Como se puede apreciar, se ha está mostrando correctamente el proceso de instalación de Drupal, pues gracias a una directiva DirectoryIndex configurada en el servidor apache2, ha sido capaz de leer el fichero index.php situado en el DocumentRoot. Lo primero que preguntará es el idioma, en este caso elegiré el Español y pulsaré en Save and continue:
Lo siguiente será seleccionar un perfil de instalación, que en este caso elegiremos el perfil Estándar, para que instale Drupal con las características más comunes preconfiguradas:
Como se puede apreciar, nos ha devuelto 1 error y 2 advertencias. El error y la segunda advertencia son problemas de falta de extensiones y librerías para el correcto funcionamiento de PHP. Su solución es sencilla, pues únicamente tendremos que instalar los paquetes correspondientes, ejecutando para ello el comando:
Los paquetes ya se encuentran instalados y por tanto el error y la segunda advertencia han sido solucionados. Todavía nos falta la primera advertencia, para poder hacer uso de URLs limpias, ofreciendo así una mejor experiencia al usuario. Un ejemplo de URL limpia sería:
Mientras que un ejemplo de una URL sucia sería:
Como se puede apreciar, el aspecto visual es muy diferente, por lo que es un problema que se aconseja arreglar. Para ello, tendremos que hacer uso del módulo rewrite de apache2, así que antes de intentar cargarlo a la ligera, vamos a comprobar si ya se encuentra cargado, mirando dentro del directorio /etc/apache2/mods-enabled/ y filtrando por dicho nombre:
En este caso, el filtro no ha devuelto ningún resultado, por lo que podemos concluir que dicho módulo no se encuentra cargado en memoria, así que para cargarlo, haremos uso de a2enmod
:
Si nos fijamos en los mensajes devueltos, el módulo ha sido correctamente habilitado, pero para activar la nueva configuración, tendremos que reiniciar el servicio apache2, cosa que no haremos todavía, ya que nos queda otra modificación por realizar, así que lo reiniciaremos al final y así conseguiremos matar dos pájaros de un tiro.
Si recordamos, anteriormente mencioné que el fichero .htaccess nos iba a ser de utilidad más adelante. Bien, pues ha llegado el momento. Dicho fichero ha sido generado por Drupal y contiene entre otras cosas un conjunto de instrucciones que permiten solucionar el problema de las URLs limpias. Pero si dicho fichero ya existe en el directorio, ¿por qué seguimos teniendo el problema? La respuesta es sencilla, y es que por defecto, la utilización de dicho fichero viene deshabilitada. Para activarla, tendremos que declarar un nuevo Directory dentro de nuestro fichero de configuración del VirtualHost en el que habilitemos la directiva AllowOverride (podríamos hacerlo también de forma generalizada en /etc/apache/apache2.conf, pero no es lo óptimo). Para ello, ejecutaremos el comando:
En este caso, la sección Directory que debemos añadir a dicho fichero afectará únicamente al DocumentRoot en el que se encuentra situado Drupal, quedando de la forma:
Tras ello, ya podremos reiniciar el servicio apache2 para que todos los cambios realizados hasta ahora surtan efecto, ejecutando para ello el comando:
Por último, para verificar que el módulo rewrite ha sido correctamente cargado en memoria, volveremos a ejecutar el comando para comprobarlo:
Como era de esperar, el filtro ahora ha devuelto un resultado referente a dicho módulo, por lo que podemos concluir que se encuentra correctamente cargado en memoria.
Una vez realizadas todas las modificaciones y comprobaciones, volveremos al instalador y refrescaremos la página, de manera que vuelva a realizar la comprobación de los requisitos, por lo que en caso de que nos pida la información de la base de datos, podremos corroborar que hemos llegado al siguiente paso y que por lo tanto, todos los problemas se han solucionado. Este paso es importante, pues dentro de la misma instalará todas las tablas necesarias para el correcto funcionamiento del CMS. En este caso, el nombre de la base de datos es drupal, el usuario es username y la contraseña es usuario:
En el caso de que las credenciales introducidas sean incorrectas, nos lo notificará y pedirá unas credenciales válidas, de manera que cuando sean válidas comenzará la instalación de Drupal:
Por último, tendremos que configurar el sitio Drupal para así adaptarlo a nuestras necesidades. Nos pedirá un nombre para el sitio, que en este caso usaré PruebaDrupal, una dirección de correo electrónico válida, una cuenta para el mantenimiento del sitio (administrador), algunas opciones regionales, tales como el país y la zona horaria…
Tras llevar a cabo toda la configuración solicitada, nuestro sitio Drupal estará totalmente operativo y funcional:
Como se puede apreciar, el sitio web es totalmente accesible desde el nombre de dominio previamente configurado (www.alvaro-drupal.com).
Realiza una configuración mínima de la aplicación (cambia la plantilla, crea algún contenido…).
Para cambiar la plantilla de Drupal, tendremos que buscar el apartado Apariencia en el menú superior, para seguidamente pulsar en Instalar nuevo tema. Una vez ahí, tendremos dos opciones: subir manualmente el fichero que contiene el tema o indicar una URL para que descargue automáticamente el tema. En mi caso, voy a elegir la segunda opción, para descargar este tema. Una vez que lo tengamos todo listo, pulsamos en Instalar:
Cuando el tema se haya descargado, tendremos que pulsar en Instalar temas añadidos recientemente y buscar dicho tema dentro de la sección Temas desinstalados, para posteriormente pulsar en la opción Instalar y seleccionar de modo predeterminado. Tras ello, podremos volver a la página principal y apreciar como el nuevo tema se ha instalado:
El procedimiento para crear un nuevo artículo/post es también muy sencillo. Para ello, tendremos que buscar el apartado Contenido en el menú superior, para seguidamente pulsar en Añadir contenido. Tendremos que seleccionar que el contenido que queremos añadir es un Artículo y simplemente rellenar el contenido del nuevo artículo que queremos crear:
Si volvemos a la página principal, podremos apreciar que el nuevo artículo ha aparecido:
Efectivamente, el nuevo artículo ya es accesible y podemos leer su contenido.
Instala un módulo para añadir alguna funcionalidad a Drupal.
Para instalar un nuevo módulo en Drupal, tendremos que buscar el apartado Ampliar en el menú superior, para seguidamente pulsar en Instalar nuevo módulo. Una vez ahí, tendremos dos opciones: subir manualmente el fichero que contiene el módulo o indicar una URL para que descargue automáticamente el módulo. En mi caso, voy a elegir la segunda opción, para descargar este módulo, que permite crear un menú desplegable dentro del apartado Configuración de la parte superior, haciéndo así mucho más intuitiva y cómoda la gestión del sitio Drupal. Una vez que lo tengamos todo listo, pulsamos en Instalar.
Cuando el módulo se haya descargado, tendremos que pulsar en Activar los módulos agregados recientemente y buscar dicho módulo dentro de la correspondiente sección a la que pertenezca, para posteriormente pulsar en el botón Instalar:
Tras ello, podremos volver a la página principal y apreciar como el nuevo módulo se ha instalado y está totalmente operativo:
Como se puede ver, el apartado Configuración del menú superior ahora muestra un menú desplegable con diversas opciones.
Tarea 3: Configuración multinodo.
Realiza una copia de seguridad de la base de datos.
Hasta ahora hemos estado trabajando con una base de datos alojada en la misma máquina que la encargada de servir la página web. Vamos a llevar a cabo un proceso de migración de la base de datos de dicha máquina a la otra que hemos creado.
Para ello, lo primero que tendremos que hacer es una copia de seguridad de la misma, que en el caso de mysql, se nos ofrece una funcionalidad que lleva a cabo dicha función, mysqldump. Gracias a la misma, se nos generará un fichero que contendrá todas las instrucciones necesarias para dejar la base de datos en cuestión tal y como está actualmente, fichero que posteriormente importaremos en la otra máquina.
En este caso, voy a generar un fichero de nombre backup-file.sql dentro del directorio raíz (aunque podríamos hacerlo en cualquier otro directorio, intentando evitar siempre el DocumentRoot de la página web, ya que en ese caso, se podría solicitar ese recurso y sería servido por apache2, algo totalmente inseguro). Para ello, ejecutaremos el comando:
Para verificar que la copia de seguridad de la base de datos drupal se ha generado correctamente, vamos a listar el contenido de dicho directorio (raíz), filtrando por el nombre backup:
Efectivamente, la copia de seguridad se ha generado correctamente en dicho directorio.
Crea otra máquina con vagrant, conectada con una red interna a la anterior y configura un servidor de bases de datos.
Dado que la máquina la habíamos definido y levantado con anterioridad, únicamente tendremos que conectarnos a la misma, ejecutando para ello el comando:
Ya nos encontramos dentro de la máquina. Para verificar que las interfaces de red se han generado correctamente, ejecutaremos el comando:
Efectivamente, contamos con dos interfaces:
- eth0: Generada automáticamente por VirtualBox y conectada a un router virtual NAT, con dirección IP 10.0.2.15.
- eth1: Creada por nosotros y conectada a una red interna lan1, con dirección IP estática 172.22.100.10.
Tras ello, tendremos que instalar los paquetes correspondientes a MySQL/MariaDB, es decir, mariadb-client y mariadb-server, no sin antes upgradear los paquetes instalados, ya que el box con el tiempo se va quedando desactualizado. Para ello, ejecutaremos el comando (con permisos de administrador, ejecutando el comando sudo su -
):
Tras ello, accederemos al servidor mysql, ejecutando para ello el comando visto con anterioridad:
Necesitaremos una nueva base de datos sobre la que restaurar la copia de seguridad, así que la crearemos, en este caso, de nombre drupalbackup:
Para verificar que la nueva base de datos se ha generado correctamente, ejecutaremos el comando:
Efectivamente, la base de datos drupalbackup ha sido correctamente generada.
En la anterior instalación, creamos un usuario que tenía el acceso permitido desde localhost, pero esta vez, no vamos a usar la base de datos de manera local, sino que queremos permitir el acceso desde el exterior. En este caso, crearemos un usuario de nombre backupuser, que tenga permitido el acceso desde 172.22.100.2, es decir, desde la máquina que queremos que se pueda conectar (si quisiéramos permitir el acceso desde cualquier dirección IP, se podría poder %), y cuya contraseña será usuario.
Tras ello, tendremos que otorgarle los privilegios necesarios sobre la base de datos que acabamos de crear, ejecutando para ello el comando:
Una vez realizadas todas las modificaciones oportunas, podremos salir de mysql haciendo uso del comando:
Esto no es todo, ya que por defecto, mysql viene configurado para escuchar únicamente peticiones desde localhost, por lo que no escucharía aquellas peticiones que vengan del exterior. Para modificar esto, tenemos que editar el fichero /etc/mysql/mariadb.conf.d/50-server.cnf, haciendo uso de nano
:
Dentro del mismo, encontraremos una línea con la siguiente forma:
Como se puede apreciar, está únicamente configurado para escuchar peticiones desde 127.0.0.1, por lo que tendremos que realizar el correspondiente cambio para que las escuche desde 0.0.0.0 (es decir, desde todas las interfaces IPv4), quedando de la siguiente manera:
Tras ello, guardaremos los cambios, y como dice la ley del informático, cada vez que toquemos un fichero de configuración, tendremos que reiniciar el correspondiente servicio, ejecutando en este caso el comando:
Ya está todo listo para realizar la restauración de la base de datos y su correspondiente conexión desde el exterior, que en un principio debería de funcionar, siempre y cuando no exista un cortafuegos bloqueando la conexión (en este caso no hay problema, pues me he asegurado previamente).
Restaura la copia de seguridad en el nuevo servidor de bases de datos.
Ha llegado la hora de pasar la copia de seguridad de una máquina a otra, es por ello que tendremos que asignarle una contraseña al usuario vagrant de la máquina a la que vamos a pasar la copia de seguridad, haciendo uso del comando passwd
:
Las máquinas vagrant tienen una pequeña “limitación”, y es que únicamente aceptan recibir conexiones SSH que utilicen la clave privada como método de autentificación, es por ello que si intentamos conectarnos de una máquina a otra, obtendremos el siguiente mensaje:
Esto nos dificulta un poco las cosas, y es que dado que necesitamos pasar la copia de seguridad de la base de datos de la máquina cms a la máquina backup, tenemos que buscar la forma de hacerlo. Una opción sería pasarla de la máquina cms a la anfitriona y posteriormente a la backup, pero es un proceso que es innecesario hacer. La solución se encuentra en desactivar esta característica en el fichero de configuración SSH de la máquina vagrant que va a recibir la conexión (/etc/ssh/sshd_config), haciendo uso de nano
:
Dentro del mismo, encontraremos una línea con la siguiente forma:
Tendremos que cambiar el valor de dicha directiva a yes, para así habilitar la autentificación con contraseña:
De nuevo, dado que hemos tocado el fichero de configuración de un servicio, en este caso ssh, tendremos que reiniciarlo:
Tras ello, ya podremos realizar la conexión SSH haciendo uso de scp
para llevar a cabo la transferencia del fichero en cuestión:
Para verificar que el fichero ha sido correctamente transferido, volveremos a la máquina en la que hemos configurado la nueva base de datos y listaremos el contenido del directorio personal haciendo uso de ls
:
Efectivamente, el fichero ha sido correctamente transferido, por lo que ya podremos importarlo a la base de datos creada con anterioridad. Para ello, únicamente inyectaremos el contenido del fichero a mysql, indicando la base de datos que deseamos recuperar, quedando de la siguiente forma:
De nuevo, accederemos al servicio mysql para verificar que la base de datos ha sido correctamente restaurada:
Tras ello, nos conectaremos a la base de datos en cuestión, con la instrucción use
:
Como podemos apreciar en el último mensaje, nos hemos conectado a dicha base de datos, así que listaremos las tablas de la misma con la siguiente instrucción:
Efectivamente, la base de datos ha sido correctamente restaurada, pues contiene las 76 tablas que habían sido anteriormente generadas durante la instalación de Drupal.
Desinstala el servidor de bases de datos en el servidor principal.
Para desinstalar el servidor de bases de datos haremos uso de apt purge
, que a diferencia de apt remove
, elimina además del paquete, sus correspondientes ficheros de configuración (entre los cuales se encuentra la base de datos), ejecutando para ello el comando:
Durante la desinstalación nos preguntará si estamos seguros de que se elimine el directorio /var/lib/mysql (que contiene las bases de datos). Seleccionaremos que sí:
Tras ello, volveremos al navegador y trataremos de acceder al sitio web Drupal (www.alvaro-drupal.com):
Como era de esperar, el sitio web no se encuentra actualmente operativo ya que hemos eliminado la base de datos a la que hacía las peticiones.
Realiza los cambios de configuración necesarios en Drupal para que la página funcione.
En este caso, la web no funciona ya que la base de datos a la que hace las peticiones no se encuentra operativa, pues la hemos migrado a otra máquina, pero esto no se lo hemos notificado al servidor, por lo que tendremos que llevar a cabo las correspondientes modificaciones en el fichero oportuno para indicarle la nueva base de datos a la que ha de realizar las peticiones. Este fichero se encuentra en /srv/drupal/sites/default/, con nombre settings.php, que modificaremos con nano
:
Dentro del mismo, nos desplazaremos al final del documento y encontraremos un bloque como el siguiente:
Como se puede apreciar, ahí se encuentran las credenciales de acceso y la base de datos a la que acceder. En este caso, el nombre de la base de datos ha cambiado de drupal a drupalbackup, el usuario ha cambiado de username a backupuser y la contraseña se ha mantenido. Nos queda una última modificación por hacer, y es que la base de datos ya no se encuentra en localhost, sino en 172.22.100.10. El puerto en el que escucha las peticiones no ha variado, pues sigue siendo el 3306. La configuración final quedaría así:
Tras ello, guardaremos los cambios, y una vez más, trataremos de acceder al sitio Drupal, para ver si el fallo ha sido solucionado:
Efectivamente, el sitio web ya ha vuelto a estar disponible ya que tiene acceso a la base de datos recuperada.
Tarea 4: Instalación de otro CMS PHP.
Configura otro VirtualHost y elige otro nombre de dominio.
Dado que este apartado consiste en repetir exactamente el mismo proceso anteriormente realizado, voy a hacerlo sin tanto detalle. En este caso, el nuevo VirtualHost lo voy a alojar dentro de /srv/, en un directorio de nombre moodle/, por lo que procederé a la creación de dicho directorio:
Una vez generado, tendremos que crear el fichero de configuración para dicho VirtualHost, así que volveré a copiar la plantilla del VirtualHost por defecto de apache2:
Tras ello, lo modificaremos haciendo uso de nano
y estableceremos el DocumentRoot (/srv/moodle) y el ServerName (www.alvaro-moodle.com, por ejemplo):
Una vez realizada la correspondiente configuración en el fichero, tendremos que habilitar el nuevo VirtualHost, ejecutando para ello el comando:
Tal y como se nos ha solicitado, vamos a volver a cargar la configuración del servicio apache2, haciendo uso del comando:
Únicamente nos falta un paso, añadir la correspondiente línea al fichero /etc/hosts de la máquina anfitriona para que lleve a cabo la resolución estatica de nombres. Para ello, ejecutamos el comando:
Tras añadir la correspondiente línea, el resultado final es el siguiente:
La máquina anfitriona ya es capaz de realizar la resolución del nombre www.alvaro-moodle.com.
Elige otro CMS realizado en PHP y realiza la instalación en tu infraestructura.
Como se ha podido deducir, el CMS que vamos a instalar es Moodle, así que dado que vamos a necesitar otra base de datos, vamos a volver a la máquina backup para crearla, con nombre moodle, por ejemplo:
La nueva base de datos ya se encuentra creada, pero tenemos que darle permisos al usuario backupuser para que pueda acceder a la misma desde la máquina donde estará alojada la Moodle. Para ello, ejecutaremos el comando:
Listo, ya hemos finalizado la configuración de la base de datos, así que podremos volver a la máquina donde vamos a descargar e instalar el CMS.
En este caso, vamos a utilizar la última versión de Moodle (3.9.2), que podremos descargar desde la página oficial, concretamente desde aquí. Para ello, primero nos moveremos al DocumentRoot donde instalaremos Moodle, ejecutando para ello el comando:
Una vez dentro del mismo, haremos uso de wget
para descargar el paquete comprimido de Moodle:
Para verificar que el comprimido se ha descargado correctamente, haremos uso del comando ls -l
:
Efectivamente, se ha descargado un paquete de nombre “moodle-3.9.2.tgz” con un peso total de 54.37 MB (57013075 bytes).
Al estar comprimido el fichero, no podemos llevar a cabo la instalación hasta que no hagamos una extracción de los ficheros contenidos. Además, para liberar espacio, borraremos tras ello el fichero comprimido ya que no nos hará falta. Para ello, ejecutaremos el comando:
Para verificar que el fichero se ha descomprimido correctamente, haremos uso del comando:
Efectivamente, todo el contenido se ha descomprimido tal y como queríamos (en lugar de descomprimir un directorio de nombre moodle del que posteriormente tendríamos que mover los ficheros contenidos al directorio actual).
Ya tenemos todos los ficheros necesarios para llevar a cabo la instalación de Moodle, pero hay un pequeño detalle que todavía no hemos contemplado, pues el usuario creador y el grupo correspondiente a dichos ficheros y directorios es 1005, por lo que al igual que en el caso anterior, procedemos a cambiar dicho propietario y grupo de forma recursiva a www-data, haciendo para ello uso del comando chown -R
, pues de otro modo no podría escribir en dichos ficheros durante la instalación:
Para verificar que el cambio se ha llevado a cabo correctamente, volveremos a listar el contenido de /srv, haciendo uso de ls -l
:
Como era de esperar, el usuario y el grupo propietario del directorio moodle/ se ha visto modificado, al igual que todos sus ficheros y directorios contenidos, al haberlo hecho de forma recursiva.
Ya está todo listo para llevar a cabo la instalación, así que volveremos a acceder al navegador de la máquina anfitriona y escribiremos el nombre de dominio previamente configurado, www.alvaro-moodle.com:
Lo primero que preguntará es el idioma, en este caso elegiré el Español y pulsaré en Siguiente:
Como se puede apreciar, nos ha devuelto 2 errores de falta de extensiones. Su solución es sencilla, pues únicamente tendremos que instalar los paquetes correspondientes, ejecutando para ello el comando:
Tras ello, tendremos que reiniciar el servicio apache2 para que los cambios realizados surtan efecto, ejecutando para ello el comando:
Una vez realizada la instalación de las extensiones y el correspondiente reinicio del servicio, volveremos al instalador y refrescaremos la página.
El siguiente paso nos pedirá indicar la ruta del directorio de datos, que usará Moodle para guardar los archivos subidos (debe encontrarse fuera del DocumentRoot, para que no sea accesible). En mi caso, la crearé dentro de /srv/, con el nombre de moodledata/, ejecutando para ello el comando:
Este directorio requiere tener a www-data como propietario y grupo, así que haremos dicha modificación ejecutando el comando:
El siguiente paso será elegir el controlador de la base de datos, que en este caso será MariaDB:
Hemos llegado a la configuración de la base de datos. Este paso es importante, pues dentro de la misma instalará todas las tablas necesarias para el correcto funcionamiento del CMS. En este caso, la dirección de la base de datos es 172.22.100.10, el nombre de la base de datos es moodle, el usuario es backupuser y la contraseña es usuario. El prefijo de las tablas no es algo relevante en este caso, y el puerto que usaremos será 3306:
Tras ello, tendremos que aceptar los términos y condiciones y continuar.
En este paso se me han mostrado nuevamente algunos problemas de extensiones, cuya solución es sencilla, pues únicamente tendremos que instalar los paquetes correspondientes, ejecutando para ello el comando:
Tras ello, tendremos que reiniciar el servicio apache2 para que los cambios realizados surtan efecto, ejecutando para ello el comando:
Por último, tendremos que configurar el sitio Moodle para así adaptarlo a nuestras necesidades. Nos pedirá un nombre para el sitio, que en este caso usaré PruebaMoodle, una dirección de correo electrónico válida, una cuenta para el mantenimiento del sitio (administrador), algunas opciones regionales, tales como el país y la zona horaria…
Tras llevar a cabo toda la configuración solicitada, nuestro sitio Moodle estará totalmente operativo y funcional:
Como se puede apreciar, el sitio web es totalmente accesible desde el nombre de dominio previamente configurado (www.alvaro-moodle.com). Además, para probar el correcto funcionamiento del CMS, he creado un nuevo curso:
Como se puede apreciar, el nuevo CMS instalado funciona correctamente.
Tarea 5: Necesidad de otros servicios.
Instala un servidor de correo electrónico en tu servidor. Debes configurar un servidor relay de correo.
En este caso, vamos a instalar un servidor de correo electrónico postfix, junto a mailutils, un paquete que proporciona una especie de envoltura para enviar correos de una manera mucho más intuitiva. Para llevar a cabo la instalación, ejecutaremos el comando:
Durante la instalación de postfix, se nos preguntará la configuración de uso, que en este caso, debemos elegir Satellite System, ya que nuestro propósito es hacer que todos los correos sean reenviados a otra máquina, para su posterior entrega:
El siguiente paso será elegir un mail name, es decir, un nombre que identifique a la máquina de forma única dentro del dominio (FQDN). En este caso, dado que únicamente vamos a usar ésta máquina para enviar correos, no es algo de lo que nos debamos preocupar, por lo que en mi caso, introduje “cms”:
Por último, tendremos que introducir la dirección de la máquina a la que vamos a reenviar los correos. En la tarea se pedía que la máquina fuese babuino-smtp.gonzalonazareno.org, pero dado que ésta máquina no es accesible desde el exterior, he decidido hacer uso de SendGrid, que nos proporciona dicha funcionalidad a través de una API. En este caso, la dirección que he tenido que introducir es:
Tras ello, y debido al modo de funcionamiento de SendGrid, tuve que realizar algunas modificaciones extra en el fichero de configuración de postfix (/etc/postfix/main.cf), ejecutando para ello el comando:
Dentro del mismo, tuve que añadir las siguientes líneas:
No vamos a entrar con mucho detalle a explicar dichas líneas, pero están relacionadas con la autorización (que usará una APIKey), con la encriptación del mensaje, el tamaño máximo de las cabeceras…
Como nos hemos fijado en las líneas anteriormente introducidas, se hace referencia a un fichero, /etc/postfix/sasl_passwd, en el que debemos introducir nuestras credenciales para poder usar el servicio de SendGrid. Lo que hacen, es proporcionarnos una APIKey que tendremos que configurar dentro de dicho fichero, ejecutando para ello el comando:
Dentro del mismo, tendremos que introducir líneas de la siguiente forma:
En este caso, tras leer la documentación de SendGrid, el usuario que debemos introducir es apikey, y la contraseña es la APIKey en cuestión (que en este caso estará censurada por razones obvias), quedando de la siguiente manera:
Por último, tendremos que cambiarle los permisos a dicho fichero para que únicamente el propietario tenga permisos de lectura y escritura (es decir, 600), haciendo uso de chmod
:
Tras ello, tendremos que mapear las tablas de postfix para que utilicen dicho fichero, ejecutando para ello el comando:
Listo, toda la configuración del servidor de correo ha sido realizada, únicamente nos queda reiniciar el servicio para que tome la nueva configuración, haciendo uso del comando:
Es hora de hacer una pequeña prueba para comprobar que la API funciona correctamente. Si recordamos, hemos instalado mailutils, que nos va a proporcionar una envoltura que permite enviar correos electrónicos de una manera más sencilla, por ejemplo, inyectándole un flujo con echo
:
Donde:
- -s: Indica el asunto del correo electrónico (Subject).
- -A: Indicamos la ruta de un fichero que queramos adjuntar al mismo.
- -a: Permite añadir valores al header del mensaje, como por ejemplo, el remitente (previamente ha tenido que ser registrado en SendGrid).
Una vez enviado, vamos a consultar los logs de postfix para verificar que se ha enviado correctamente, pero filtrando por yopmail, ya que es una cadena contenida en el correo electrónico del destinatario. Para ello, ejecutaremos el comando:
Efectivamente, como se puede apreciar, el status del correo es sent, y ha devuelto un mensaje de Ok, por lo que podemos ir a la bandeja de entrada del correo electrónico destinario para verificarlo. En este caso, se trata de un correo electrónico temporal, así que este es el resultado:
Como se puede apreciar, el correo electrónico ha sido correctamente recibido, junto al fichero vacío de prueba.
Configura alguno de los CMS para utilizar tu servidor de correo y realiza una prueba de funcionamiento.
En este caso, he decidido configurar el sitio Drupal para que utilice el servidor de correo, así que lo primero que haré será moverme al DocumentRoot de dicho VirtualHost, haciendo uso de cd
:
Tras ello, volveremos a nuestro sitio web Drupal, ya que requiere que instalemos un módulo, por lo que seguiremos el procedimiento previamente visto, es decir, tendremos que buscar el apartado Ampliar en el menú superior, para seguidamente pulsar en Instalar nuevo módulo. Una vez ahí, tendremos que indicar una URL para que descargue automáticamente el módulo.
Cuando el módulo se haya descargado, tendremos que pulsar en Activar los módulos agregados recientemente y buscar dicho módulo dentro de la correspondiente sección a la que pertenezca, para posteriormente pulsar en el botón Instalar:
El módulo ya se encuentra instalado, pero dicho módulo hace uso por debajo de un paquete llamado phpmailer, cuya versión en la paquetería de Debian es inferior a la requerida, por lo que tendremos que utilizar un sistema alternativo para su instalación. Para ello, instalaremos composer, un manejador de dependencias PHP que debemos instalar, ejecutando para ello el comando:
Ya tenemos el manejador de dependencias instalado, pero todavía tenemos que instalar la dependencia en cuestión, haciendo uso del comando:
Listo, toda la paquetería necesaria está instalada, así que volveremos a Drupal y accederemos a la configuración del módulo previamente instalado (para ello, volvemos a pulsar en Ampliar y volvemos a buscar dicho módulo, para posteriormente pulsar en el desplegable y en Configurar).
Dentro de la configuración, tendremos que marcar la opción Activado para que use SMTP como el sistema de correo por defecto, además de configurar el servidor SMTP al que vamos a acceder, que en este caso se encuentra alojado en localhost, escuchando peticiones en el puerto 25, además de desactivar la encriptación y el TLS. El resto de opciones lo podemos dejar por defecto:
Por último, guardaremos los cambios y en la parte inferior de la misma página, encontraremos un apartado que nos permite llevar a cabo un envío de un correo electrónico de prueba, por lo que simplemente introduciremos el email del destinatario y continuaremos:
Una vez más, volveremos a mirar los logs del servicio postfix para verificar que no ha habido ningún error durante el envío:
Efectivamente, como se puede apreciar, el status del correo es sent, y ha devuelto un mensaje de Ok, por lo que podemos ir a la bandeja de entrada del correo electrónico destinario para verificarlo, así que este es el resultado:
Como se puede apreciar, el correo electrónico ha sido correctamente recibido por parte del CMS, así que podemos corroborar que la configuración del servidor de correo en el CMS ha funcionado.