Virtualhosting en Apache
_____________________________________________________________________________________________________________________
Iván Belmonte Sánchez, ttyp0@inet2u.com
Revisión 1.0, 10 de Febrero de 2002
ASSL Asociación de Soporte al Software Libre, http://assl.ath.cx
Virtualhosting en mi Apache? Para que?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Apache es el servidor web más utilizado en los entornos Unix. Este documento no pretende explicar sus características
ni TODA su sintaxis... en el se pretende dar unas básicas nociones sobre lo que es el virtualhosting y cómo se
configura en un servidor Apache.
Los datos oficiales de este servidor web son los siguientes:
Pagina oficial: http://www.apache.org
Documentacion oficial: http://httpd.apache.org/docs
Última versión: 1.3.23
Podemos encontrar documentación muy valiosa relacionada con Apache en LinuxDoc (wwww.linuxdoc.org) para saber más
acerca de su funcionamiento, su configuración con módulos para php y ssl, o para que admita extensiones frontpage.
Bien, sin más preámbulos, vamos a lo que nos interesa...
1.- Qué hace apache?
~~~~~~~~~~~~~~~~~~~~
Apache, como servidor web, simplemente se limita a responder peticiones de clientes (navegadores) que quieren ver el
contenido de algunos archivos alojados en el disco duro de la máquina sobre laque corre el servidor. Es importante
entender que el servidor no *ejecuta* NADA, no reproduce sonidos ni interpreta el lenguaje en el que esta codificada
la página web que solicita el cliente. El servidor simplemente recibe una petición, y coge el archivo que el navegador
le pide, y se lo muestra.El encargado de interpretar el código es *exclusivamente el navegador*.
El servidor tiene un puerto de escucha (normalmente el puerto 80) por el que se le realizan las peticiones. Una vez
recibida la petición, simplemente deja ver al navegador el fichero que busca.
Pongamos el ejemplo de un dominio que está alojado en un servidor apache. Para nuestro caso, bien podríamos hablar de
un dominio 'en principio' falso, tal como www.fakedomain.net
Un usuario abre su cliente web, por ejemplo netscape, y teclea en el campo de la URL la dirección de nuestro dominio
fictício. Lo primero que hará su ordenador es consultar a su servidor de DNS para resolver la IP del dominio, y una
vez sepa la IP, le enviará una petición conforme quiere ver el contenido del hosting de nuestro dominio...
El servidor recibirá la petición, y lo primero que hará será buscar el directorio donde se almacenan los archivos
relacionados con esa página. Una vez encontrado el directorio, buscará un archivo INDEX, que será el que muestre por
defecto. Si el servidor no encuentra ningún archivo INDEX, devolverá un mensaje de error que puede cambiar en según
que situaciones.
- Qué es un archivo Index? -
Es el archivo que se muestra por defecto cuando el servidor recibe una petición. Podemos prescindir de un archivo
INDEX, pero entonces la direccion de nuestra web, pasaría de ser www.fakedomain.net a ser
www.fakedomain.net/archivo.htm, donde 'archivo.htm' sería el nombre que le hemos dado al archivo de la página
principal.
Es decir, es facil... nuestro servidor, a menos que lo cambiemos, por defecto entiende las direcciones de la siguiente
manera:
www.fakedomain.net lo interpreta como www.fakedomain.net/index.html
y de ese modo, siempre que reciba una petición para ver una pagina web, buscara el archivo INDEX dentro del directorio
perteneciente al dominio.
- Y el INDEX siempre tiene que ser .HTML? -
No. Aqui entra en juego el archivo de configuración de nuestro servidor, en el que podemos especificar que busque
archivos INDEX con las extensiones que queramos. Obviamente debemos tener cuidado con especificar extensiones que
sepamos que están soportadas. Por ejemplo, no deberíamos especificar que el INDEX pueda ser .pl si no tenemos Perl
instalado en nuestro sistema.
Os pongo un ejemplo de un Apache configurado para responder a peticiones con archivos INDEX de extension .html y .php:
-------------------- cut here ------------------------
#
# DirectoryIndex: Name of the file or files to use as a pre-written HTML
# directory index. Separate multiple entries with spaces.
#
DirectoryIndex index.html index.php
-------------------- cut here ------------------------
Como veis, tambien podriamos especificar que el archivo INDEX se llamase entrada.html, o bienvenida.php, o
MiPriperaPagina.htm... pero no es lo que debemos hacer, puesto que existen unos estandares que por bien de todos
deberiamos tratar de seguir. A la hora de configurar un servidor con fines comerciales nos las veriamos negras si
tuviésemos que personalizar el servidor para este tipo de necesidades en cada cliente ;-)
- Y como le digo al servidor donde tiene que ir a buscar el archivo INDEX? -
Bueno, como decía antes, el servidor recibe una petición y se va a buscar el directorio donde se almacenan los
archivos relacionados con la página solicitada. en el archivo de configuración encontramos una sección donde se
especifica la raiz de los documentos.
Aquí os dejo un ejemplo:
-------------------- cut here ------------------------
#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/htdocs"
-------------------- cut here ------------------------
En este caso, el servidor recibiría una petición para ver www.fakedomain.net, y directamente iría a /var/www/htdocs a
buscar el archivo index.html o index.php, y si lo encontrase, lo mostraría.
MUY BIEN!! ya tenemos un Apache funcionando en el que podemos alojar la página web de un dominio.
Hmmm... que pasaría si quisiéramos alojar otra página web, correspondiente a otro dominio? tendríamos que montar otra
máquina con otra IP y otro Apache?
No señores...
2.- VIRTUALHOSTING
~~~~~~~~~~~~~~~~~~
Existe una manera de almacenar en diferentes directorios los archivos correspondientes a diferentes páginas web,
obviamente de diferentes dominios (o subdominios de un dominio... lo veremos más adelante). Se llama VirtualHosting, y
como casitodo en Apache, se define como un 'tag'... de la siguiente forma:
-------------------- cut here ------------------------
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for requests without a known
# server name.
#
ServerAdmin admin@fakedomain2.net
DocumentRoot /home/fakedomain2/www/htdocs
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/fakedomain2/"
ServerName www.fakedomain2.net
ErrorLog logs/fakedomain2-error_log
CustomLog logs/fakedomain2-access_log common
-------------------- cut here ------------------------
Nadamas abrir el tag (tag es sinónimo de 'etiqueta', es lo que se encuentra entre los simbolos < y >) nos encontramos
con el comando 'VirtualHost' que indica que se va a especificar un nuevo directorio para una nueva página web, aparte
de la que ya teníamos, así como el comportamiento que debe adquirir el servidor al recibir una petición para mostrar
esa página.
Acto seguido vemos las directivas del VirtualHost:
ServerAdmin: e-mail del administrador de ese website
DocumentRoot: directorio en el que se alojan los ficheros de la web
ScriptAlias: directorio donde se alojan los cgi's de la web
ServerName: direccion que teclea el cliente como URL
ErrorLog: fichero de log de errores
CustomLog: fichero de log de accesos
Podemos escribir más directivas, con las que especificar si un directorio tiene que estar protegido con un password, o
especificar si un directorio puede ser navegable (ver su contenido al estilo FTP, sin HTML de por medio)... pero
básicamente la estructura de un VirtualHost simple se remite al ejemplo.
Ahora podemos entender que hayan varias páginas web alojadas en un mismo servidor con una misma IP. Solo debemos crear
un VirtualHost por cada dominio o subdominio que queramos alojar.
Lo del subdominio no es mas que, por ejemplo si el propietario de un dominio quiere hacer una subseccion de ese
dominio, puede hacer algo así:
http://fake.fakedomain.net
donde vemos que 'fake' es un nombre que se le da al subdominio, y 'fakedomain.net' es eldominio en si. De ese modo, si
por ejemplo una compañía está estructurada en varias secciones, podría esquematizar su web del siguiente modo:
http://www.empresa.com
http://ventas.empresa.com
http://personal.empresa.com
http://soporte.empresa.com
http://catalogos.empresa.com
etc...
etc.....
etc.......
siendo cada subdominio una parte de la empresa... y a la hora de hospedar su web en un servidor apache, cada
subdominio tendría su propio VirtualHost en el que almacenar los archivos de la web, que cada seccion tendria una web
independiente. Lo único que tendríamos que hacer sería cambiar en cada caso el valor de las directivas de cada
VirtualHost.
Realmente a los ojos de quien hospeda su páginaen nuestro servidor, esto es totalmente transparente...ellos logean con
su usuario y password y tienen un directorio donde subir por FTP los archivos de su web.
- Y como sabe el servidor qué página tiene que mostrar ante una petición? -
Cuando un cliente lanza una petición a un servidor, en la cabecera de sus paquetes esta especificada la dirección del
origen y la de destino, así como su 'nombre' sin resolver. De ese modo, Apache puede saber exactamente que dominio se
intenta visualizar, y busca el VirtualHost en el que la directiva NameServer coincide con el dominio especificado en
la cabecera. Es importante tener en cuenta que para crear un subdominio de un dominio, tenemos que notificarlo al
administrador del servidor de DNS que nos ha proporcionado el dominio, para que cree una entrada en el DNS con el
nombre del subdominio y la IP hacia la que apunta, sino, no funcionara ;-)
Bien, y creo que con esto no me dejo nada pendiente. Si bien como decía al principio del documento, no pretendo
explicar la sintaxis a fondo para la configuración de un servidor Apache, sino lafilosofía de cómo funciona. Para más
datos sobre la configuración podeis dirigiros a la documentación oficial y a los HOW-TO's.
Un Saludo!
ttyp0