¿Qúe son los Host Virtuales?

El objetivo de un host virtual es hacer funcionar varios sitios web, usando varios dominios o subdominios, en el mismo servidor. Pueden estar basados en direcciones IP o basados en nombres. Apache soporta el uso de host virtuales para alojar múltiples páginas web.


Creación y configuración de Virtual Hosts

En primer lugar comprobamos si esta activado el uso de hosts virtuales, descomentando la siguiente linea (quitando el símbolo “#”) del archivo de configuración “httpd.conf” de Apache.

# Include conf/extra/httpd-vhosts.conf

Para añadir hosts virtuales debemos buscar el archivo de httpd-vhosts.conf de Apache, normalmente se encuentra en “/usr/local/apache2/conf/extra/httpd-vhosts.conf” pero dependiendo del sistema operativo puede variar la ubicación.

Si la ubicación del archivo de configuración es otra se puede buscar usando el comando find.

find / -name "httpd-vhosts.conf"

La estructura básica de un archivo httpd-vhosts.conf es la siguiente:

Listen 80

NameVirtualHost *:80

<VirtualHost _default_:80>
        DocumentRoot "/www"
</VirtualHost>

<VirtualHost *:80>
	DocumentRoot /www/example1
	ServerName www.example.com
</VirtualHost>

<VirtualHost *:80>
	DocumentRoot /www/example2
	ServerName www.example.org
</VirtualHost>

Puerto de escucha del servidor de Apache.

Listen 80

Directiva necesaria para configurar los host virtuales basados en nombres. Indica la dirección IP y el puerto sobre la que escuchan los servidores virtuales. Se puede usar el comodín * para los servidores de los cuales no se conozca su dirección IP o bien sean IPs dinámicas.

NameVirtualHost *:80

Host virtual predeterminado donde será redirigido en caso de que no se especifique otro.

<VirtualHost _default_:80>
        DocumentRoot "/www"
</VirtualHost>

Cada host virtual tiene esta estructura.

<VirtualHost *:80>
	DocumentRoot /www/example1
	ServerName www.example.com
</VirtualHost>

En cada host virtual se debe especificar la IP y el puerto de escucha, sino queremos especificar ninguna dirección IP basta con poner el comodín * (asterisco).

Directivas básicas:

  • DocumentRoot: Directorio base de la página web.
  • ServerName: Nombre y número de puerto del host virtual.

Existen más directivas para aplicar a un host virtual:

  • ServerAlias: Establece un nombre alternativo para el host virtual.
  • ServerAdmin: Dirección de email que el servidor incluye en los mensajes de error que se envían al cliente.
  • ServerPath: URL que se usará para hosts virtuales basados en nombre que son accedidos con un navegador incompatible.
  • ErrorLog: Ruta donde se guardarán los registros los errores provocados en el host virtual.
  • TransferLog: Ruta donde se guardarán los registros de acceso a el host virtual.

*También se pueden usar expresiones regulares con “RewriteRule” dentro de un host virtual.


NOTA: Para aplicar los cambios es necesario reiniciar Apache.

sudo /etc/init.d/apache2 restart

o

service httpd restart

*Este comando varia dependiendo del sistema operativo.


También podemos aplicar más opciones a un host virtual con las directivas de Apache.

<Directory "/www/example1">
	Options Indexes FollowSymLinks
	Order allow,deny
	Allow from all
</Directory

*En este ejemplo se permite e uso de enlaces simbólicos, se permite el acceso a todos…


Editar el archivo hosts del servidor

Una vez configurados los host virtuales debemos configurar el archivo hosts del servidor para añadir la dirección IP de cada uno.
Si usamos un servidor Linux el archivo se encuentra en:

/etc/hosts

La estructura del archivo hosts es esta:

127.0.0.1   localhost
127.0.0.1   example.com
127.0.0.1   www.example.com
127.0.0.1   site1.example.com
...

*Otra opción seria montar un servidor DNS con Bind o DNSmasq.


Evitar la ejecución de código PHP

Si no queremos que en cierto host virtual se puedan ejecutar scripts PHP (por motivos de seguridad), debemos agregar las siguientes directivas, dentro de un virtual host específico:

  • php_flag engine off
  • php_value engine off

Ejemplo de un archivo de configuración de hosts virtuales

NameVirtualHost *:80

Listen 80

<VirtualHost _default_:80>
        DocumentRoot "/www"
</VirtualHost>
<VirtualHost *:80>
        ServerName website1.example.com
        DocumentRoot "/www/example1"
</VirtualHost>
<VirtualHost *:80>
        ServerName website2.example.com
        DocumentRoot "/www/example2"
        ErrorLog "/var/log/error_site2.log"
        TransferLog "/var/log/transfer_site2.log"
</VirtualHost>
<VirtualHost *:80>
        ServerName website3.example.com
        DocumentRoot "/www/example3"
        php_flag engine off
        php_value engine off
</VirtualHost>

Creamos 3 host virtuales, en el segundo de ellos habilitamos un registro de errores y accesos, y el en tercero deshabilitamos la ejecución de código PHP.
*El host virtual “_default_” es el predeterminado.


FUENTES

http://httpd.apache.org/docs/2.2/vhosts/examples.html