Como configurar Virtual Hosts en Apache 2 y Ubuntu

Los más habitual en un entorno de desarrollo, de pruebas o de pre-producción es que tengamos varios proyectos conviviendo en paralelo. Y como ser organizado no es solo una virtud, sino que es una cualidad imprescindible para evitar el caos de cara al futuro, los hosts virtuales de Apache 2 son una buena forma de lograrlo.

Apache Virtual Hosts

Los ejemplos de este documento han sido probados tanto sobre Ubuntu Mate 16.0.4.2 y Apache 2.4.18 como sobre XUbuntu 18.04 con la versión 2.4.29 de Apache, aunque funcionarán sobre la mayoría de distribuciones Linux con la versión 2.4 de Apache.

Para el resto del artículo, asumiremos que la ip de la máquina dónde estamos configurando los host virtuales es 192.168.1.10.

¿Qué es un virtual host en Apache 2?

Virtual host es la herramienta que Apache pone a nuestra disposición para poder publicar más de una página web en un mismo servidor Apache, y que además,  nos permite mantener configuraciones diferentes para cada host virtual.

Al realizar una petición al servidor web, Apache puede identificar a que site (host virtual) queremos acceden en función de tres variables relacionadas con la solicitud realuzada al servidor:

  1. La IP
  2. El Host Name
  3. El puerto

En este artículo distinguiremos los host virtuales por el puerto, pues es lo que utilizo habitualmente en mi entorno de desarrollo por una simple cuestión de comodidad.

Nociones de configuración

Toda la configuración de Apache 2 se encuentra bajo la carpeta /var/apache2. Los archivos de configuración para los virtual hosts se encuentran dentro de dos carpetas en particular:

  1. /var/apache2/sites-available. En esta carpeta se encuentran todos los archivos de configuración de los hosts virtuales, cada host se corresponde con un archivo.
  2. /var/apache2/sites-enabled. En esta carpeta se crearán enlaces simbólicos a los archivos de la carpeta sites-available para los host que queramos activar en cada momento.

Con la instalación de Apache, se creará por defecto, el archivo /etc/apache2/sites-available/000-default.conf y su correspondiente enlace simbólico en la carpeta sites-enabled que se encarga de configurar el host virtual por defecto al que accedemos tras instalar Apache.

Cómo crear un virtual host

Crear host virtuales es una tarea relativamente habitual, así que los señores desarrolladores de Apache nos lo han puesto bastante sencillo.

A continuación crearemos un host virtual para alojar un entorno de pruebas de este blog. Para entender mejor el proceso, a pesar de que es sencillo, lo dividiremos en cuatro pasos:

Paso 1: Creamos el directorio que alojará nuestra web

Lo primero será crear el directorio dónde alojaremos los archivos que posteriormente serviremos.

cd /var/www
sudo mkdir ahierro.es
cd ahierro.es
sudo mkdir public

La carpeta que serviremos será public, es buena idea guardarse un nivel de directorio para archivos relacionados con el proyecto que no deben ser accesibles desde una url en el navegador. Esto es bastante habitual en muchas aplicaciones y frameworks.

En este paso del proceso es importante dejar correctamente configurados los permisos de acceso a los archivos y carpetas de nuestro host virtual. Para ello os dejo un enlace al artículo Archivos y permisos de usuario en Apache 2 y Linux por si queréis echarle un vistazo.

Paso 2: Creamos el archivo de configuración del nuevo host virtual

Ahora crearemos el archivo de configuración en /etc/apache2/sites-available, lo más sencillo es hacerlo desde otro que ya exista. Es muy importante que lleve la extensión .conf o el comando a2ensite no funcionará más adelante:

cd /etc/apache2/sites-available
sudo cp 000-default.conf ahierro.es.conf

Lo editamos:

sudo vim ahierro.es.conf

Inicialmente tenemos algo así:

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Y tras modificarlo debe quedar así:

<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/ahierro.es/public

# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf

<Directory /var/www/ahierro.es/public>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

</VirtualHost>

Como podemos ver en la línea 1 hemos cambiado :80 por :8085, con lo que estamos indicando que a este virtualhost accederemos mediante este puerto. Personalmente suelo comenzar con el puerto 8080, en este ejemplo he especificado el 8085 porque ya tengo otros cinco host virtuales.

En la línea 12 lo único que hemos hecho es actualizar la referencia al directorio raíz para asegurarnos que apunta al lugar adecuado.

Y por último hemos añadido una nueva sección a partir de la línea 30 con unas directrices básicas entre las que hemos habilitado el módulo mod_rewrite, necesario para la re-escritura de urls.

Paso 3: Abrimos el puerto adecuado en Apache

Por defecto Apache solo atiende solicitudes por el puerto 80. Para conseguir que también atienda las que llegan por el puerto 8085, que es el que hemos indicado en nuestro fichero de configuración del virtual host, debemos editar el archivo /etc/apache2/ports.conf.

sudo vim /etc/apache2/ports.conf

El contenido del fichero es algo así:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80
Listen 8085

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls>
Listen 443
</IfModule>

Vemos que la  línea 5 hace referencia al puerto 80, nosotros hemos añadido una línea más, la 6, indicándole que escuche también el puerto 8085.

Paso 4: Habilitamos el nuevo virtualhost

Si os habéis fijado hablamos de los directorios sites-available y sites-enabled, pero solo hemos trabajado con el primero. Para crear el enlace simbólico lo haremos con el comando a2ensite:

sudo a2ensite ahierro.es.conf

Y por si te lo estás preguntando, si, un ln o un cp servirían de igual manera. Y ahora que el enlace simbólico ya se encuentra en el directorio sites-enabled solo nos queda reiniciar apache:

sudo service apache2 restart

Paso 5: Comprobamos que todo funcione correctamente

Podemos comprobar que todo ha salido bien con dos sencillos pasos

  1. Creamos un archivo index.html y lo guardamos en el directorio público del host virtual que acabamos de crear, en este caso /var/www/ahierro.es/public.
  2. Accedemos a la ip del servidor seguida de dos puntos y el puerto: http://192.168.1.10:8085/index.html.

Si vemos el contenido del archivo index.html es que todo ha salido bien, en caso contrario deberemos buscar el problema en función del mensaje de error obtenido.

Conclusión

Una forma sencilla de organizar nuestros proyectos siempre que no sean demasiados.

Personalmente, en el virtual host por defecto (puerto 80),  creo un sencillo fichero con enlaces a todos los hosts virtuales y otros accesos directos que me interesa tener a mano como pueden ser phpmyadmin o phpinfo. Esto suele ahorrarme unos minutos preciados minutos cada día.

Y como siempre me gustaría saber tú opinión,  ¿utilizas los virtual host? ¿los identificas por puerto? ¿organizas tus proyectos de otra forma? Deja un comentario y aprendamos juntos.

Créditos, referencias y artículos relacionados

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *