46.4. Hosts virtuales

El término host virtual hace referencia a la capacidad de Apache para proporcionar servicio a varios identificadores de recursos universales (URI, del inglés Universal Resource Identifiers) desde el mismo equipo físico. Esto significa que varios dominios, como www.ejemplo.com y www.ejemplo.net pueden ejecutarse desde un mismo servidor Web en un equipo físico.

Es una costumbre habitual emplear hosts virtuales para ahorrar esfuerzos administrativos (sólo es necesario realizar el mantenimiento de un servidor Web) y gastos de hardware (no es necesario emplear un servidor dedicado para cada dominio). Los hosts virtuales pueden estar basados en nombres, en IP o en puertos.

Los hosts virtuales pueden configurarse mediante YaST (consulte Ordenador predeterminado) o editando manualmente la sección Virtual Host (Host virtual) de httpd.conf (consulte la Sección 46.3.2, “Configuración manual de Apache”).

Apache está preparado para emplear por defecto en SUSE Linux un archivo de configuración por cada host virtual /etc/apache2/vhosts.d/. Este directorio incluye una plantilla básica para hosts virtuales (vhost.template). La configuración de hosts virtuales también se puede añadir en cualquier lugar, por ejemplo en un archivo incluido en la configuración.

[Important]Importante

Puede resultar muy útil comprobar la configuración del host virtual con el comando httpd2 -S. Proporciona los ajustes del host virtual tal y como los entiende Apache y pueden ayudar al usuario a conseguir los resultados deseados. Si emplea Apache con indicadores como -DSSL, deberá emplear los mismos indicadores al realizar las pruebas, por ejemplo httpd2 -S -DSSL.

46.4.1. Hosts virtuales basados en nombres

Los hosts virtuales basados en nombres permiten que más de un sitio Web proporcione servicios desde una misma dirección IP. Apache utiliza el campo de host en el encabezado HTTP enviado por el cliente para conectar la petición con una entrada ServerName (Nombre del servidor) que coincida en una de las declaraciones de host virtuales. Si no se encuentra ninguna entrada ServerName, se utiliza por defecto la primera entrada VirtualHost que se especifique.

NameVirtualHost inicia la sección Virtual Host en la configuración de Apache.

46.4.1.1. NameVirtualHost

NameVirtualHost indica al servidor Web Apache en qué dirección IP y, opcionalmente, en qué puerto debe escuchar las peticiones de los clientes que contengan el nombre de dominio en el encabezado HTTP.

El primer argumento puede ser un nombre completo de dominio, pero es recomendable utilizar la dirección IP. El segundo argumento es opcional y corresponde al puerto. El puerto 80 se utiliza y se configura por defecto mediante la directiva Listen (Escucha) (Selección de dispositivos de red).

El comodín * puede utilizarse tanto para la dirección IP como para el número de puerto, a fin de recibir peticiones en todas las interfaces. Las direcciones IPv6 deben incluirse entre corchetes.

Ejemplo 46.8. Variaciones de entradas VirtualHost basadas en nombres

# NameVirtualHost Dirección IP[:puerto]
NameVirtualHost 192.168.1.100:80
NameVirtualHost 192.168.1.100
NameVirtualHost *:80
NameVirtualHost *
NameVirtualHost [2002:c0a8:164::]:80
                

46.4.1.2. <VirtualHost></VirtualHost> en el contexto basado en nombres

Los bloques <VirtualHost></VirtualHost> incluyen la información aplicable a un dominio concreto. Cuando Apache recibe una petición de un cliente relacionada con un VirtualHost definido, emplea las directivas incluidas en esta sección. Puede emplearse cualquier directiva de Apache permitida en el contexto de VirtualHost. La etiqueta de apertura VirtualHost emplea los siguientes argumentos en una configuración de host virtual basada en nombres:

  • Dirección IP (o nombre completo de dominio), declarada anteriormente en la directiva NameVirtualHost.

  • Número de puerto opcional, declarado anteriormente en la directiva NameVirtualHost.

También está permitido utilizar el comodín * como sustituto de la dirección IP. Esta sintaxis sólo es válida en combinación con el uso de comodines en NameVirtualHost *. Las direcciones IPv6 deben estar incluidas entre corchetes.

Ejemplo 46.9. Directivas VirtualHost basadas en nombres

<VirtualHost 192.168.1.100:80> 
    ServerName www.ejemplo.com 
    DocumentRoot /srv/www/htdocs/ejemplo.com 
    ServerAdmin webmaster@ejemplo.com 
    ErrorLog /var/log/apache2/www.ejemplo.com-error_log 
    CustomLog /var/log/apache2/www.ejemplo.com-access_log common
</VirtualHost>

<VirtualHost 192.168.1.100:80> 
    ServerName www.ejemplo.net 
    DocumentRoot /srv/www/htdocs/ejemplo.net 
    ServerAdmin webmaster@ejemplo.net 
    ErrorLog /var/log/apache2/www.ejemplo.net-error_log 
    CustomLog /var/log/apache2/www.ejemplo.net-access_log common
</VirtualHost>

<VirtualHost [2002:c0a8:164::]> 
    # 2002:c0a8:164:: es el equivalente en formato IPv6 de 192.168.1.100 
    ServerName www.ejemplo.org 
    DocumentRoot /srv/www/htdocs/ejemplo.org 
    ServerAdmin webmaster@ejemplo.org 
    ErrorLog /var/log/apache2/www.ejemplo.org-error_log 
    CustomLog /var/log/apache2/www.ejemplo.org-access_log common
</VirtualHost>
                

En este ejemplo, ambos dominios, tanto www.ejemplo.com como www.ejemplo.net se alojan en el equipo que tiene la dirección IP 192.168.1.100. La primera entrada VirtualHost es la entrada por defecto para todas las peticiones entrantes que recibe el servidor Web.

No es obligatorio que las directivas ErrorLog (Registro de errores), descrita en la Sección 46.3.2.3.4, “ErrorLog archivo | "|comando", y CustomLog (Registro personalizado), consulte http://httpd.apache.org/docs-2.0/mod/mod_log_config.html#customlog, incluyan el nombre de dominio. Puede utilizar un nombre de su elección.

46.4.2. Hosts virtuales basados en IP

Esta configuración alternativa de host virtual requiere la configuración de varias direcciones IP para un mismo equipo. Una instancia de Apache aloja varios dominios y a cada uno de ellos se le asigna una dirección IP diferente.

[Important]Direcciones IP y hosts virtuales basados en IP

El servidor físico debe disponer de una dirección IP para cada host virtual basado en IP. Si el equipo no tiene varias tarjetas de red, también se pueden emplear interfaces de red virtuales (asignación de alias IP).

46.4.2.1. Configuración de alias IP

Para que Apache pueda alojar varias direcciones IP, el equipo físico debe aceptar peticiones dirigidas a varias IP. Este mecanismo se denomina alojamiento IP múltiple. También es necesario activar los alias IP en el núcleo. Es el ajuste por defecto en SUSE Linux.

Una vez que el núcleo se ha configurado para los alias IP, los comandos ifconfig y route se pueden utilizar para definir direcciones IP adicionales en el host. Estos comandos se deben ejecutar como usuario Root.

En el siguiente ejemplo, se presupone que el host ya tiene la dirección IP 192.168.0.10 asignada para el dispositivo de red eth0. Introduzca el comando ifconfig para ver la dirección IP del host. Existe la posibilidad de añadir direcciones IP adicionales empleando los siguientes comandos:

ip addr add 192.168.0.20/24 dev eth0
ip addr add 192.168.0.30/24 dev eth0
            

Todas estas direcciones IP se asignan al mismo dispositivo físico de red (eth0).

46.4.2.2. <VirtualHost></VirtualHost> en el contexto basado en IP

Una vez configurados los alias IP en el sistema (o cuando se ha equipado al host con varias tarjetas de red), se puede configurar Apache. Debe emplearse un bloque VirtualHost para cada uno de los servidor virtuales.

El siguiente ejemplo muestra cómo Apache se ejecuta en un equipo con la dirección IP 192.168.1.10, alojando dos dominios en las direcciones IP adicionales 192.168.0.20 y 192.168.0.30. Este ejemplo en concreto sólo funciona en una red privada, dado que el intervalo de direcciones IP que va desde 192.168.0.0 hasta 192.168.0.255 está reservado para las redes privadas.

Ejemplo 46.10. Directivas VirtualHost basadas en IP

<VirtualHost 192.168.0.20> 
    ServerName www.ejemplo.com 
    DocumentRoot /srv/www/htdocs/ejemplo.com 
    ServerAdmin webmaster@ejemplo.com 
    ErrorLog /var/log/apache2/www.ejemplo.com-error_log 
    CustomLog /var/log/apache2/www.ejemplo.com-access_log common
</VirtualHost>

<VirtualHost 192.168.0.30> 
    ServerName www.ejemplo.net 
    DocumentRoot /srv/www/htdocs/ejemplo.net 
    ServerAdmin tux@ejemplo.net 
    ErrorLog /var/log/apache2/www.ejemplo.net-error_log 
    CustomLog /var/log/apache2/www.ejemplo.net-access_log common
</VirtualHost> 
                

En este ejemplo, las directivas VirtualHost sólo se especifican para las interfaces distintas de 192.168.0.10. Si también se configura una directiva Listen (Escucha) (descrita en Selección de dispositivos de red) para 192.168.0.10, debe crearse un host virtual basado en IP individual para responder a las peticiones HTTP realizadas a esa interfaz o se aplicarán las directivas encontradas en la sección Main Server (Servidor principal) de /etc/apache2/httpd.conf (consulte la Sección 46.3.2.3, “Directivas de Apache en /etc/apache2/httpd.conf: servidor principal ”).