Apuntes DAW – Virtual Host

Configuración de un sitio virtual (VirtualHost)

Un sitio web lo podemos entender como un directorio donde tenemos los recursos, páginas html, hojas de estilo, imágenes… que va a servir nuestro servidor.

Para poder tener distintos servicios web en una misma IP y en un mismo puerto, cambiando el nombre para acceder al servidor, un virtual host será capaz de servir distintos sitios web.

Por defecto, nuestro servidor tiene configurado un único sitio web, pero esto podemos variarlo.

Esta configuración del sitio virtual (por defecto) se encuentra en la siguiente ruta:

/etc/apache2/sites-available/000-default.conf

/etc/apache2/sites-enables/000-default.conf

Para que la configuración forme parte del servidor, tiene que estar activo en sites-enables, si no estuviese activo, no aparecería el link en esta carpeta. Dentro de este fichero, tenemos la directiva DocumentRoot /var/www/html

Configurar un fichero Virtual Host

Se inicia el fichero con la etiqueta

<VirtualHost *:80>
            #ServerName www.example.com cuando hay varios VirtualHost es imprescindible para saber que el usuario quiere acceder a este virtualhost en concreto.
            ServerAdmin webmaster@localhost normalmente se coloca el correo de la persona responsable del sitio web.
            DocumentRoot /var/www/html si el usuario accede a este VirtualHost se le sirve los ficheros que tengamos en esta carpeta.
            ErrorLog ${APACHE_LOG_DIR}/error.log ruta donde guarda el log de los errores
            CustomLog ${APACHE_LOGO_DIR}/acces.log combined ruta donde guarda el log de los accesos.
</VirtualHost>

Configurar nombre para que el servidor sirva una página en concreto.

Si no tenemos servicio DNS, lo hacemos mediante los ficheros “hosts” Esto se hace en el cliente, modificando el archivo /etc/hosts

Crear un nuevo VirtualHost

Ejemplo guiado para Servidor que responde por nombre.

Para crear un nuevo sitio virtual, debemos crear en la carpeta sites-available los archivos de configuración correspondientes, para ello, el mejor modo es copiar alguno de los ya existentes con el nombre que deseemos.

Por ejemplo, en nuestro caso vamos a crear un sitio con el nombre “hidalgoperez” y para ello vamos a utilizar la copia de las opciones que presenta el sitio por defecto 000-default.conf

Y vamos a querer, que la carpeta que contenga la información del sitio, tenga el mismo nombre. Para ello, como sabemos, por defecto nuestro servidor Apache guarda los sitios en la ruta indicada en el fichero apache2.conf, que viene establecida como /var/www/

Vamos a crear el directorio para nuestro sitio, ello lo hacemos con la directiva mkdir, y le aplicamos los permisos para poder acceder y utilizarlo con otros usuarios:

# chown -R www-data:www-data /var/www/hidalgoperez

Una vez tenemos estos pasos realizados, configuremos el archivo hidalgoperez.conf que hemos creado en /etc/apache2/sites-available:

En esta ocasión, hemos cambiado varias opciones:

ServerName www.hidalgoperez-prueba.org
esto será lo que nos haga que el VirtualHost, una vez reciba una petición por parte del cliente a su IP, mediante el nombre www.hidalgoperez-prueba.org por el puerto 80, tal y como aparece indicado en la primera línea de configuración del archivo, sepa identificar que ha de servir este sitio, y no el default o alguno de los otros que almacene.

DocumentRoot /var/www/hidalgoperezm
esto indica la ruta en la que ha de buscar el sitio nuestro servidor, por defecto aparecía html y ahora lo hemos cambiado por la carpeta creada en el punto anterior.

También he modificado los archivos de logs para poder disponer de los archivos personalizados de logs de acceso y error personalizados para este sitio, en vez de recibirlos en uno general.

ErrorLog ${APACHE_LOG_DIR}/error_hidalgoperez.log
CustomLog ${APACHE_LOG_DIR}/access_hidalgoperez.log combined

Con estos pasos, tendríamos nuestro sitio web configurado, ya sólo nos quedaría habilitar el sitio (ahora mismo está disponible, pero no habilitado) y reiniciar el servicio para que surjan efecto.

Comprobamos que la configuración del sitio es correcta mediante el comando apache2ctl -t

Para habilitarlo utilizamos la directiva (puede ser necesiaria utilizarla con sudo) a2ensite hidalgoperez

Para reiniciar el servicio utilizamos:

systemctl reload apache 2

Con estos pasos ya tendríamos creado nuestro nuevo sitio web, configurado y habilitado para recibir peticiones mediante el nombre www.hidalgoperez-prueba.org

Para probar que funciona correctamente nos iremos a una de las máquinas que tenemos configuradas como cliente, en este caso un Ubuntu 20.04.1

En esta máquina de debemos configurar el fichero /etc/hosts para incluirle la dirección a la que debe asociar la llamada http://www.hidalgoperez-prueba.org (la IP de nuestro server).

Virtual Host que sirve los sites por Puerto

En el ejemplo anterior, hemos realizado paso a paso la creación de un site y lo hemos configurado para que el mismo responda a una llamada por nombre (#ServerName), sin embargo, como comentábamos más arriba, nuestro Server Apache también puede responder enviando dos sitios diferentes dependiendo el puerto por el que haya recibido la llamada.

¿Qué quiere decir esto?

Por ejemplo, si disponemos de dos sitios, hidalgoperez y manolohidalgo, podemos configurarlo, por ejemplo, para que si nos llaman por la IP 192.168.1.1:80 nos sirva el sitio hidalgoperez y si en vez de realizarse por el puerto de defecto (80), se nos indica 192.168.1.1:8080 presente el sitio manolohidalgo

Como ves, es el mismo funcionamiento que teníamos anteriormente mediante nombre, pero en este caso el que determinará el site a servir será el puerto.

Para realizar esta configuración tan sólo debemos realizar una pequeña modificación en el archivo de configuración del sitio, que recordemos tendría la siguiente configuración:

Ejemplo del sitio hidalgoperez el cual escucha por el puerto 80, como podemos observar en la primera línea.

<VirtualHost *:80>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/hidalgoperez
            ErrorLog ${APACHE_LOG_DIR}/error_hidalgoperez.log
            CustomLog ${APACHE_LOGO_DIR}/acces_hidalgoperez.log combined
</VirtualHost>

Ejemplo del sitio manolohidalgo el cual escucha por el puerto 8080.

<VirtualHost *:8080>
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/manolohidalgo
            ErrorLog ${APACHE_LOG_DIR}/error_manolohidalgo.log
            CustomLog ${APACHE_LOGO_DIR}/acces_manolohidalgo.log combined
</VirtualHost>

Por último, una vez tenemos configurados ambos sitios, hemos de tener en cuenta que nuestro servidor Apache por defecto está configurado para escuchar por el puerto 80, por tanto hemos de modificar el archivo:

/etc/apache2/ports.conf

En el mismo tan sólo debemos incluir la directiva Listen 8080, para indicar que también debe escuchar por este puerto.

Una vez realizado este procedimiento, debemos recargar o reiniciar el servicio de apache para que nos cargue la nueva configuración y ya estará funcionando.

VirtualHost que sirve los sites por IP

Este caso es quizás el menos habitual, ya que para ello necesitamos que nuestro server cuente con diferentes tarjetas de red y pueda trabajar con más de una IP, pero si así fuese, podríamos hacerlo con unos cambios en las directivas muy breves, tan sólo tendríamos que modificar el * de la etiqueta <VirtualHost *:80> a la IP asignada a ese site, por ejempo: <VirtualHost 192.168.1.1:80> teniendo en cuenta que cada site, tendría la IP que nos interesase hacerle corresponder.