Servidores Virtuales en Apache
Copyleft © 29 de Octubre de 2004 por Miguel Hernández Martos (enlavin)
Qué son los sitios web virtuales
Los sitios web virtuales nos permiten tener varios sitios webs independientes dentro de la misma máquina sin tener que lanzar varias instancias de Apache. Así podemos optimizar recursos.
Hay fundamentalmente dos formas de definir sitios virtuales:
- Por IP: se identifica a cada servidor por una IP diferente.
- Por nombre: el servidor web escucha peticiones en una única IP y es el nombre de la página en que define qué contenido se va a mostrar.
Voy a explicar esta última forma que es la más sencilla y la que más habitualmente me he encontrado. Los ejemplos los he sacado de debian. En otras distribuciones es posible que los ficheros de configuración de apache estén en otro sitio y/o estén más modularizados. También se pueden definir sitios virtuales utilizando otros puertos (por ejemplo para sitios https) y mezclando identificación por IP y por nombre, pero eso otra historia y deberá ser contada en otra ocasión.
Estructura de cada sitio virtual
Cuando configuro apache para tener sitios virtuales siempre intento mantener una estructura coherente entre los diferentes sitios para que luego sea sencillo encontrar las cosas. Supongamos que los sitios virtuales se almacenan en:
/mnt/sites/sitio1.comhtmlaqui se guardan las páginas y los scripts phpcgi-binaqui irán los cgi propios del sitioincludesiempre creo unincludepor encima dehtmlpara colocar librerías y otros scripts de php que conviene apartarlos por si falla la configuración de apache. De esa forma podemos poner contraseñas o información delicada y hay menos riesgo de que sea vista por una mala configuración del servidor web.
Configurando Apache
Editamos /etc/apache/httpd.conf y nos vamos al final del fichero. Primero se definen los permisos de ejecución para los directorios cgi-bin de cada sitio virtual:
<Directory /mnt/sites/*/cgi-bin/>
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
El siguiente paso es decirle a Apache que escuche en el puerto 80 de cualquier IP y que distinga los sitios virtuales por nombre:
NameVirtualHost *:80
Ahora viene el meollo del asunto. Para cada sitio virtual que vayamos a definir tenemos que especificar su nombre, los directorios donde están los scripts y todas esas cosas. Todas las configuraciones que se establezcan entre las marcas <VirtualHost>...</VirtualHost> son únicas de ese sitio y sobreescriben a las predeterminadas de Apache:
<VirtualHost *:80>
# Importante! Esto define el nombre del sitio y lo identifica
ServerName www.sitio1.com
# El sitio puede ser accedido por otros nombres además del primario
ServerAlias sitio1.com
ServerAdmin webmaster@sitio1.com
# Directorio para cgi
ScriptAlias /cgi-bin/ /mnt/sites/sitio1.com/cgi-bin/
# Raiz para las páginas y scripts PHP
DocumentRoot /mnt/sites/site1.com/html/
# Se pueden personalizar los ficheros log para cada sitio
ErrorLog /var/log/apache/host.site1.com-error.log
CustomLog /var/log/apache/host.site1.com-access.log common
# Manejadores de error. No son necesarios pero dan un toque más serio a la web
ErrorDocument 404 /error/404.php
ErrorDocument 401 /error/401.php
# Configuración de la ruta de búsqueda para PHP. Cada sitio virtual puede tener
# un include_path independiente.
php_value "include_path" ".:/mnt/sites/sitio1.com/include"
# nota: esto ultimo a veces da problemas según qué versiones de PHP. Caso de encontrarnos con
# problemas de este tipo lo mejor es definir el "include_path" en el fichero
# /mnt/sites/sitio1.com/html/.htaccess
</VirtualHost>
Este sitio puede accederse desde un navegador al solicitar www.sitio1.com o sitio1.com. Si se quiere otro sitio, pues otra marca <VirtualHost> :
<VirtualHost *:80>
ServerName www.sitio2.com
ServerAlias sitio2.com gcubo.org
ServerAdmin webmaster@sitio2.com
ScriptAlias /cgi-bin/ /mnt/sites/sitio2.com/cgi-bin/
DocumentRoot /mnt/sites/site2.com/html/
ErrorLog /var/log/apache/host.site1.com-error.log
CustomLog /var/log/apache/host.site1.com-access.log common
php_value "include_path" ".:/usr/share/pear:/mnt/sites/sitio2.com/include"
</VirtualHost>
Y así con todos los sitios que se necesiten. El segundo sitio podría ser llamado como www.sitio1.com, sitio2.com o gcubo.org desde un navegador.
Es relativamente simple automatizar la creación de sitios virtuales para una máquina que tenga que servir muchos de ellos. Se puede crear un directorio /etc/apache/vhosts y hacer un fichero por sitio virtual. Luego en la configuración de Apache se haría:
##-- vhosts --##
Include vhosts/sitio1.com.conf
Include vhosts/sitio2.com.conf
(...)
##-- eovhosts --##
Formato que es simple de modificar mediante scripts.
Para probar la configuración sin necesidad de tener nombres de dominio de verdad podemos añadir
entradas en el fichero /etc/hosts de la máquina donde se ejecute el navegador (o c:\windows\system32\drivers\etc\hosts si es windows):
192.168.1.80 sitio1.com www.sitio1.com sitio2.com www.sitio2.com
Suponiendo claro que esa es la IP del servidor web de pruebas.
Pues ya está. Eso es to, eso es to, eso es todo amigos!





