Cómo configurar hosts virtuales de Apache en Ubuntu 22.04
El concepto de alojamiento virtual lo utilizan las empresas para alojar varios sitios web utilizando una sola máquina. Se puede conseguir con un método «basado en IP» o con un enfoque «basado en nombres». En el alojamiento «basado en IP» tenemos direcciones IP distintas para cada sitio web. En el caso del alojamiento «basado en nombres», tenemos varios nombres funcionando en cada dirección IP.
¿Qué vamos a hacer?
En este tutorial veremos cómo podemos alojar dos hosts virtuales en un sistema Ubuntu 22.04 utilizando el alojamiento virtual basado en nombres. Utilizaremos el servidor web Apache.
Empieza ahora…
Paso 1. Actualiza el repositorio y también el sistema operativo:
sudo apt update
sudo apt upgrade -y
Paso 2. Instala el servidor web Apache para Ubuntu utilizando el comando:
sudo apt install apache2 -y
Paso 3. Reinicia el servidor web Apache y comprueba su estado ejecutando:
sudo systemctl restart apache2
sudo systemctl status apache2
Salida de ejemplo:
? apache2.service - The Apache HTTP Server Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese> Active: active (running) since Mon 2022-06-27 09:32:14 UTC; 18s ago Docs: https://httpd.apache.org/docs/2.4/ Process: 13093 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/S> Main PID: 13098 (apache2) Tasks: 55 (limit: 1146) Memory: 4.7M CPU: 25ms CGroup: /system.slice/apache2.service ??13098 /usr/sbin/apache2 -k start ??13099 /usr/sbin/apache2 -k start ??13100 /usr/sbin/apache2 -k start
Paso 4. Crea dos nuevos directorios dentro de la carpeta ‘www’. Que estos directorios sean host1 y host2.
De nuevo, dentro de estos directorios crea una carpeta más para guardar tus archivos web. Que estos directorios sean public_html y public_html. Estos directorios contendrán los archivos index.html correspondientes a estos dos hosts:
sudo mkdir -p /var/www/host1/public_html
sudo mkdir -p /var/www/host2/public_html
Los directorios ‘/var/www/host1/public_html’ y ‘/var/www/host2/public_html’ también representan la raíz del documento para los dos hosts virtuales.
Paso 5. Los directorios creados anteriormente son propiedad del usuario root. Para permitir que un usuario normal modifique los archivos de estos directorios, se debe cambiar la propiedad mediante los comandos:
sudo chown -R $USER:$USER /var/www/host1/public_html
sudo chown -R $USER:$USER /var/www/host2/public_html
La variable ‘$USER’ utilizará el valor del usuario actual conectado. El directorio ‘public_html’ será ahora propiedad de este usuario.
Paso 6. Ahora establece el permiso de ‘acceso de lectura’ para el directorio web general de apache:
sudo chmod -R 755 /var/www
Paso 7. Ahora estableceremos una página por defecto, es decir, index.html, para cada host virtual. Esto se puede hacer directamente desde el terminal utilizando el comando ‘echo’. Para el host virtual1:
sudo echo “Welcome to Virtual Host 1.” > /var/www/host1/public_html/index.html
Para el host virtual2:
sudo echo “Welcome to Virtual Host 2.” > /var/www/host2/public_html/index.html
Paso 8. Antes de continuar, utilizaremos un paso intermedio. Aquí modificaremos el archivo hosts para asignar la dirección del host local a los dos nombres de dominio del host virtual: www.host1.com y www.host2.com. Esto se hace para evitar registrar públicamente nuestros nombres de dominio.
sudo sh -c "echo 127.0.0.1 www.host1.com >> /etc/hosts"
sudo sh -c "echo 127.0.0.1 www.host2.com >> /etc/hosts"
Los pasos anteriores se muestran en la siguiente imagen:
Paso 9. Ahora crearemos dos archivos de host virtual para cada uno de nuestros hosts virtuales. Son similares a los dos archivos de configuración por defecto de apache («000-default.conf»). Ahora estos archivos representarán la configuración que se utilizará para nuestros hosts virtuales y también regirán cómo responderá el servidor web Apache a las distintas peticiones de dominio.
El «000-default.conf» puede utilizarse como archivo base para cada host virtual. Simplemente copia este archivo en la misma ubicación con dos nombres diferentes: host1.conf y host2.conf:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/host1.conf
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/host2.conf
Paso 10. Ahora abre los archivos y modifícalos para cada host virtual. Por ejemplo, para el host virtual1, los siguientes parámetros deben modificarse como:
<VirtualHost *:80> ServerAdmin [email protected] ServerName host1 ServerAlias www.host1.com DocumentRoot /var/www/host1/public_html ErrorLog ${APACHE_LOG_DIR}/error.log </VirtualHost>
Para el segundo archivo (host2.conf), sustituye las entradas de host1 por las de host2. También puedes crear dos archivos nuevos e introducir el contenido anterior correspondiente a cada host virtual. El archivo host2.conf tendrá el siguiente aspecto:
<VirtualHost *:80> ServerAdmin [email protected] ServerName host2 ServerAlias www.host2.com DocumentRoot /var/www/host2/public_html ErrorLog ${APACHE_LOG_DIR}/error.log </VirtualHost>
Paso 10. Ahora que hemos creado los archivos de host virtual, es el momento de habilitar realmente estos archivos. Para ello, Apache proporciona una herramienta llamada «a2ensite». Utiliza el siguiente comando para habilitarlos:
sudo a2ensite host1.conf
sudo a2ensite host2.conf
Paso 11. En el terminal, verás un mensaje para recargar apache para activar la nueva configuración, pero antes desactiva el sitio por defecto representado por «000-default.conf» utilizando el comando:
sudo a2dissite 000-default.conf
Paso 12. Comprueba si hay algún error de sintaxis en los archivos de configuración utilizando:
sudo apache2ctl configtest
Paso 13. Por último, recarga el servicio apache2 para aplicar los cambios realizados anteriormente:
sudo systemctl reload apache2
Probar la configuración del vhost de Apache
Ahora comprobaremos si todo está configurado correctamente. Abre un terminal en tu máquina y ejecuta el comando
$ curl www.host1.com
El comando anterior debería devolver el mensaje de la página de índice del host virtual1, del mismo modo, el comando siguiente debería mostrar el mensaje del host virtual2:
$ curl www.host2.com
Conclusión
Por fin lo hemos conseguido, nuestro alojamiento virtual funciona como esperábamos. También podemos realizar este tutorial utilizando Terraform, simplemente pruébalo.