Servidores virtuales con Apache 2.4 bajo Debian 10

Servidores virtuales con Apache 2.4 bajo Debian 10

A nivel de servidores web tanto para pruebas locales como de produccion, es importante conocer como tener en un mismo servidor varios sitios web o de internet, ejecutandose al mismo tiempo; dicho de mejor manera, tener varias sitios y con dominios (subdominios) diferentes en un mismo servidor.

Para esto necesitamos configurar a apache de tal modo que sea capaz de re-direccionar a directorios difrenetes, dependiendo del dominio que usemos, para este ejemplo he decidio usar dos posibles dominios:

vhost1.net  y  vhost2.net

para los dos casos las configuraciones que explicarñe son las mismas; es decir simplemente las repetimos.

Dememos tener en claro que ambos subdominios apuntaran a la misma IP; ya que como dijimos es un solo servidor web y en nuestro caso será a una IP de nuestra red local (LAN). En cualquier caso, toda esta guía es aplicable también a dominios reales.

Configuracion por default de apache 2.4

Instalar apache es múy simple, desde la terminal y como administradores ta solo debemos ingresar el siguiente comando y esperar a que éste se instale de manera automática; como siempre recuerda que debes estar conectado a internet, puesto que desde ahi se instalan las aplicaciones; a menos que desees hacxerlo desde el disco que creaste con el ISO bajado del sitio oficial de Debian.

# sudo apt install apache2

esparamos que el proceso de instalacion termine y listo lo podemos probar, en mi caso instale apache en la máquina Debian 10 que tiene asignada la IP: 192.168.1.160; de tal forma que si deseo probar que dicha instalación se realizó correctamente solo debo abrir el navegador y colocar en la caja de direcciones URL la IP asignada:

 

Directorios de configuración de los servidores virtuales de Apache

Las configuraciones de los distintos servidores virtuales se almacenan en una carpeta, normalmente un archivo por cada servidor virtual que configuremos. Se podrían tener varios servidores virtuales configurados a través del mismo archivo de configuración, pero el mantenimiento sería mucho más engorroso y complejo.

En Debian GNU/Linux, la configuración de Apache 2.4 se guarda en la carpeta

/etc/apache2/

Dentro de esta encontramos las carpetas sites-available/ y sites-enabled/

/etc/apache2/sites-available/    <–  Servidores virtuales configurados

En esta carpeta se guardan los archivos de configuración de cada servidor virtual que se tenga configurado. En una instalación nueva ya hay un archivo, 000-default.conf, que guarda la configuración por defecto del servidor. A partir de la versión 2.4 de Apache, estos archivos de configuración tienen la extensión .conf a lo que hay que prestarle mucha atención.

Es en esta carpeta es donde crearemos los nuevos archivos de configuración de los nuevos servidores virtuales.

El hecho de que existan los archivos de configuración en esta carpeta no significa que apache los cargue en su configuración al arrancar. Ahora veremos cómo se hace esto.

/etc/apache2/sites-enabled/ <–  Servidores virtuales activos

En esta carpeta aparecen enlaces simbólicos a los archivos de configuración de sites-available/ éstos sí se activan al arrancar o recargar la configuración de Apache. Por lo tanto, una vez configurado, para activar un servidor virtual hay que crear un enlace simbólico desde sites-enabled/ hasta el archivo de configuración situado en sites-available/.

En una instalación inicial de Apache 2.4 ya existirá el enlace simbólico sites-enabled/000-default.conf a sites-available/000-default.conf.

Servidor virtual por defecto de Apache

Hemos visto que una instalación limpia de Apache dirige cualquier petición a un dominio no configurado al servidor por defecto. Y que este servidor se configura a través del siguiente archivo, 000-default.conf:

Si editamos el archivo 000-default.conf, lo que veríamos es lo siguiente:

<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>
En realidad el archivo es más pequeño de lo que parece ya que la mayoría de líneas son solo comentarios por eso tiene el simblo # al inicio de cada línea. Si quitamos esasa línea simplemente lo veríamos asi:
<VirtualHost *:80>
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Analizando este “esqueleto” de configuración del servidor virtual, su comportamiento especial (responder a todos los dominios que apunten al servidor y que no tengan configuración propia) se debe a la primera directiva o instrucción desactivada, la directiva ServerName. Esta es la directiva que establece a qué dominio pertenece esta configuración.

Teniendo en cuenta esto, ya podemos empezar a crear las configuraciones para nuestros propios servidores virtuales.

Configurando el servidor virtual desde cero

Creamos el archivo /etc/apache2/sites-available/vhost1.local.conf con nuestro editor de texto favorito y privilegios de root:

# sudo nano /etc/apache2/sites-available/vhost1.local.conf

Hemos visto en el archivo del servidor por defecto que toda la configuración está encerrada en una directiva VirtualHost, así que será lo primero que incluyamos:

<VirtualHost *:80>

</VirtualHost>

En la directiva VirtualHost indicamos desde qué dirección escuchará el servidor (IP propia), y tras los dos puntos (:) indicamos el puerto en el que Apache esperará las conexiones. El asterisco o wildcard (*) indica que Apache atenderá peticiones desde todos los adaptadores de red que tenga configurados. Por ejemplo, si especificáramos 127.0.0.1 el servidor sólo sería accesible localmente. En cuanto al puerto, 80 es el puerto HTTP estándar.

Ahora vamos a especificar el dominio al que responderá esta configuración, mediante ServerName:

<VirtualHost *:80> 

ServerName vhost1.net 

</VirtualHost>

ServerName tiene un cometido muy simple, especificar qué dominio queremos atender. Solamente eso. En cada servidor virtual tendremos que especificar un dominio distinto. Ahora el servidor dejará de ofrecer la página principal por defecto, mostrando en su lugar la que más adelante vamos a especificar.

En uno de los dominios de ejemplo tenemos configurado un subdominio www. En muchos sitios web se sirve la misma página tanto si especificamos el dominio solamente o el subdominio www. Esto no sucede de forma automática. Si ambos nombres apuntan a la misma dirección, tenemos que configurar el servidor para que atienda ambos nombres. Aquí entra en funcionamiento la directiva ServerAlias:

<VirtualHost *:80>
ServerName vhost1.net 
ServerAlias www.vhost1.net 
</VirtualHost>

Especificando el otro dominio o subdominio como alias, Apache ofrece la misma página para ambas peticiones. Podemos configurar tantos alias como queramos, bien añadiéndolos separados por espacios en blanco en la misma línea, bien añadiendo distintas directivas ServerAlias.

Es hora de especificar el directorio donde van a residir los archivos del sitio web, esto se hace mediante la directiva DocumentRoot:

<VirtualHost *:80>

 ServerName vhost1.net
 ServerAlias www.vhost1.net
 DocumentRoot /home/henry/public_html/vhost1

</VirtualHost>

De forma sencilla especificamos la carpeta de archivos del servidor virtual, basta con especificar la ruta completa. En el ejemplo, sitúo esta carpeta dentro del directorio public_html/ de mi usuario. Lógicamente cada uno puede situar la carpeta en el lugar del sistema de archivos que más le interese.

Ya casi estamos, falta especificar los accesos y permisos al directorio web. Lo haremos a través de un bloque Directory:

<VirtualHost *:80>

 ServerName vhost1.local
 ServerAlias www.vhost1.net
 DocumentRoot /home/henry/public_html/vhost1 
 <Directory /home/henry/public_html/vhost1> 
                    Require all granted
</Directory>
</VirtualHost>

Dentro de la directiva Directory establecemos ciertos accesos. Todo lo que no especifiquemos quedará con los valores por defecto de la configuración por defecto de Apache. En versiones 2.2 y anteriores no era necesario, pero a partir de Apache 2.4 hay que permitir explícitamente el acceso a cualquier directorio web que no esté bajo la ruta /var/www/ a través de la cláusula Require all granted.

Con esta configuración mínima, y haciendo que Apache reinicie o recargue su configuración YA funciona el nuevo servidor virtual.

Afinando la configuración del servidor virtual

Sería conveniente especificar un par de detalles más en la configuración de acceso al directorio web añadiendo un par de cláusulas más en el bloque Directory:

<VirtualHost *:80>

ServerName vhost1.net
ServerAlias www.vhost1.net
DocumentRoot /home/henry/public_html/vhost1
<Directory /home/henry/public_html/vhost1>
        Options -Indexes
        AllowOverride all Require
        all granted
</Directory>

</VirtualHost>

Añadimos una cláusula AllowOverride all para poder alterar el funcionamiento del servidor a través de los archivos .htaccess en el directorio web. Incluyo esta configuración porque ya no recuerdo cuál fue la última web en que trabajé que no necesitara un archivo .htaccess para realizar redirecciones, reescrituras de URLs, etc.

Otra cláusula que añado es Options -Indexes, con la que se prohíbe el acceso a carpetas y subcarpetas del sitio web que no contengan un archivo index (index.php, index.html, etc.) ya que si estuviese activada la opción Indexes se mostraría el contenido de la carpeta y se podría acceder a archivos cuya existencia el visitante normalmente no debería conocer. El comportamiento por defecto suele ser desactivar Indexes, pero lo especifico por seguridad. Quien quiera desactivar la prohibición de acceso debería especificar la cláusula como Options Indexes.

Activación de logs propios para el servidor virtual

Con esta configuración, los registros de acceso al servidor virtual se almacenan en el archivo /var/log/apache2/other_vhosts_access.log, mientras que los registros de error se añadirían al archivo /var/log/apache2/error.log.

Lo interesante es que cada servidor virtual tenga sus propios archivos de registro, tanto de acceso como de errores, así que añadiríamos algunas directivas más:

<VirtualHost *:80>

ServerName vhost1.net
ServerAlias www.vhost1.net
DocumentRoot /home/henry/public_html/vhost1
<Directory /home/henry/public_html/vhost1>
           Options -Indexes
           AllowOverride all
           Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/vhost1.local-error.log
CustomLog ${APACHE_LOG_DIR}/vhost1.net-access.log combined
LogLevel info

</VirtualHost>

Es muy importante configurar de forma óptima los archivos de registro de cada servidor virtual, ya que ofrecen valiosísima información sobre accesos y errores.

Y con esta configuración tenemos ya muy perfilado el funcionamiento del servidor virtual. Para el servidor virtual del dominio vhost2.local el archivo sería muy parecido:

<VirtualHost *:80>
ServerName vhost2.net
DocumentRoot /home/henry/public_html/vhost2
<Directory /home/henry/public_html/vhost2>
          Options -Indexes
          AllowOverride all
          Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/vhost2.local-error.log
CustomLog ${APACHE_LOG_DIR}/vhost2.local-access.log combined
LogLevel info
</VirtualHost>

La diferencia es que para este dominio no se ha configurado ningún alias (no se podría acceder como www.vhost2.local) y se especifica su propio directorio de archivos web y archivos de registro personalizados.

Activación y desactivación de los servidores virtuales

Las configuraciones que acabamos de realizar se guardarían en sendos archivos de configuración, por ejemplo /etc/apache2/sites-available/vhost1.net.conf y /etc/apache2/sites-available/vhost2.net.conf.

Para que Apache cargue estas configuraciones es necesario crear los enlaces simbólicos correspondientes desde /etc/apache2/sites-enabled/. Esto se podría hacer a mano, pero normalmente Apache incluye utilidades para activar y desactivar los servidores virtuales.

En Debian con Apache 2.4 activamos un servidor virtual con el comando a2ensite:

# sudo a2ensite vhost1.net.conf vhost2.net.conf
Enabling site vhost1.net.
Enabling site vhost2.net.
To activate the new configuration, you need to run:
systemctl reload apache2

Podemos indicar varios servidores virtuales en el mismo comando.

Para desactivar servidores virtuales tenemos el comando a2dissite:

# sudo a2dissite vhost1.net
Site vhost1.net disabled.
To activate the new configuration, you need to run:
systemctl reload apache2

Ya sea activación o desactivación, cualquier cambio en la configuración de los servidores virtuales entrará en funcionamiento tras hacer que Apache recargue su configuración, o tras el siguiente reinicio de Apache.

Recargaremos la configuración de Apache con systemctl:

# sudo systemctl reload apache2

Antes de acceder a los servidores virtuales habrá que crear los directorios donde se alojará el contenido, referenciados en los archivos de configuración:

# mkdir -p public_html/vhost1 public_html/vhost2

Para no obtener errores de acceso, podemos añadir al menos un archivo index.html con cualquier contenido en cada directorio web de cada servidor virtual y ya estaremos listos para acceder desde el navegador a las direcciones http://vhost1.net, http://www.vhost1.net y http://vhost2.net.

para el caso de vhost1.net:

para el caso de vhost2.net:

Listo! hasta este punto hemos creado nuestros servidores virtuales con apache2, en el siguiente link encambio explicxaré como colocar el sistema web en modo seguro y permitiendo navegar con HTTPS, haz click aqui para ir a la sigueinte entrada o busca en el menú SSL para servidores virtuales.

 

 

You must be logged in to post a comment