Ir al contenido principal

Varios Dominios en un Solo Servidor Web (Virtual Hosts - More than One Domain With One Web Server)

Nota: Las siguientes indicaciones fueron probadas pro mi en Linux Crunchbang 11 (32-bit) alías Waldorf.

Si tu deseas tener más de un dominio en un solo servidor Web, es muy probable que necesites hacer uso de Virtual Hosts para ello. Virtual Hosts, te da la posibilidad de tener más de un sitio Web (o dominio) en un solo servidor. En este artículo te explicaremos como hacerlo.

Para este articulo crearemos dos dominios: dominio1.com y dominio2.com

Creando el Layout
Si usas Debian o Crunchbang, vete a /var/www, y create el sigiuente conjunto de carpetas:
mkdir -p dominio1.com/{public,private,log,cgi-bin,backup}
y
mkdir -p dominio2.com/{public,private,log,cgi-bin,backup}

Archivo para Probar los Dominios
Para probar que los dos dominios trabajan, crearemos un archivo sencillo en HTML llamado index.html, el cual contendra dentro de el, lo siguiente:
<html>
  <head>
    <title>dominio#.com</title>
  </head>
  <body>
    <h1>dominio#.com</h1>
  </body>
</html>

Nota: Recuerde crear estos archivos en la ruta dominio#.com/public/index.html y reemplazar el símbolo # por 1 y 2 para cada dominio respectivamente.

Ya hecho esto, tenemos la estructura para crear los Virtual Hosts.

Configurando los Permisos
Con el fin de que el servidor Apache pueda servir tus dominios, este deberá tener permisos de lectura para varios archivos que componen tus sitios. Para asegurarnos que tenemos los permisos de la manera correcta, debemos ejecutar los siguientes comandos para ambos dominios:
sudo chmod -R a+rX /var/www/dominio#.com

Este comando establece que todo en su directorio dominio#.com debe ser legible y accesible por todos los usuarios del sistema.
Si agrega más directorios de dominios virtuales adicionales posteriormente, ejecute el comando de nuevo para asegurarse de que los nuevos directorios son accesibles.


NameVirtualHost

Para cada interfaz y puerto, Apache está configurado para escuchar una directiva NameVirtualHost. Algo a tener en cuenta es que sólo se puede definir de una vez por puerto.

En el diseño de configuración de Apache hay una directiva NameVirtualHost por defecto que se encuentra en el archivo "ports.conf"
Vamos a echar otro vistazo a los contenidos de "ports.conf":
cat /etc/apache2/ports.conf

La salida del comando anterior debería ser:
NameVirtualHost *:80
Listen 80

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

El ajuste predeterminado (por defecto) del NameVirtualHost satisface nuestras necesidades presentes. Apache aplicará la lógica de virtual host basada en nombres y los valores de peticiones HTTP realizadas en cualquier interfaz disponible (*) en el puerto 80.


Personalizando los Virtual Host
Para cada sitio Web, debemos crear un archivo conocido como vhost file. Estos son creados en la siguiente ruta: /etc/apache2/sites-available. Un ejemplo para el sitio o dominio1, sería:
sudo nano /etc/apache2/sites-available/dominio1.com

Ahora como modelo general el vhost file debe contener lo siguiente (los valores pueden cambiar en base a lo que tu sitio Web debe contener):
# Place any notes or comments you have here
# It will make any customization easier to understand in the weeks to come

# dominio: dominio1.com
# public: /var/www/dominio1.com/

<VirtualHost *:80>

  # Admin email, Server Name (domain name) and any aliases
  ServerAdmin webmaster@domain1.com
  ServerName  dominio1.com
  ServerAlias domain1.com


  # Index file and Document Root (where the public files are located)
  DirectoryIndex index.html
  DocumentRoot /var/www/dominio1.com/public


  # Custom log file locations
  LogLevel warn
  ErrorLog  /var/www/dominio1.com/log/error.log
  CustomLog /var/www/dominio1.com/log/access.log combined

</VirtualHost>

Activando el Sitio
Ya tenemos el sitio disponible y debemos activarlo con el siguiente comando:
sudo /usr/sbin/a2ensite dominio1.com
La salida del comando debe ser:
Site dominio1.com installed; run /etc/init.d/apache2 reload to enable.
En Kali Linux 1.0, el mensaje o salida es:
Enabling site domain1.com.
To activate the new configuration, you need to run:

service apache2 reload

Y como dice la salida, reiniciamos el Apache:
sudo /etc/init.d/apache2 reload
En Kali Linux 1.0, en lugar de ejecutar a2ensite domain1.com, puedes correr: service apache2 reload


Probando Nuestros Sitios
Para probar el dominio sin necesidad de crear una zona DNS y el registro (s) en algún servidor de nombres de Internet (s), he modificado el archivo "/etc/hosts" en mi equipo local para incluir algunas de las entradas de mapeo "dominio1.com", etc.:
127.0.0.1    localhost
...

# entries related to the demo slice
123.45.67.890   dominio1.com
123.45.67.890   www.domain1.com
123.45.67.890   dominio2.com
...

Puede agregar entradas similares en su archivo "hosts", aunque su ubicación puede variar dependiendo de qué sistema operativo estes utilizando.

Ahora, probemos accediendo al sitio dominio1.com desde nuestro navegador preferido:
Domain1 Home Page
Tu deberías ver tu archivo index.html que configuramos para este virtual host.

ServerAlias
Nota que en el archivo vhost hemos agregado la sentencia ServerAlias. Si tu tienes los DNS configurados correctamente, tu podrías usar la dirección establecida en el ServerAlias para alcanzar tu sitio Web. Para próposito de prueba, tú puedes agregar otra línea en el archivo host (como hicimos arriba en este mismo artículo):
Domain1 Home Page (hostname alias)


Repetir Pasos para el Dominio o Sitio Web 2
Para crear y activar el dominio2.com, simplemente has lo siguiente:

sudo nano /etc/apache2/sites-available/dominio2.com
...
# Entre los detalles para dominio2.com como en el ejemplo de arriba
Para activar el sitio y reiniciar el Apache:
sudo a2ensite dominio2.com
...
sudo /etc/init.d/apache2 reload
Finalmente adiciona una entrada a tu archivo host de tu computadora y navega al segundo dominio:
http://dominio2.com
or
http://www.dominio2.com
Si todo fue configurado bien, tú verás el archivo Index del dominio2.com.

Archivos Logs
Como fue definido en los archivos vhost, cada dominio tiene sus propios Log files. Vamos a verlos:
ls /var/www/dominio1.com/log/

La salida debería reflejar lo configurado en los vhost:
access.log  error.log

Observaciones
  • Recuerde que la máquina virtual predeterminada se encuentra todavía en su lugar.
  • Ahora, si alguien accede a la dirección IP de su servidor verán al sitio definido por dicho archivo vhosts por defecto (siempre, claro está, que no hayan establecido un host virtual independiente para la dirección IP).
  • ¿Por qué se sirve a partir de ese archivo host virtual?. Apache busca en los vhosts habilitados en orden alfabético, y si no puede encontrar uno que se aplica específicamente a la dirección IP o nombre de dominio solicitado, sólo sirve el primer host virtual que vio.
  • Si hubiéramos deshabilitado o eliminado el host virtual predeterminado, se muestra el contenido de dominio1.com (siendo este antes que dominio2.com alfabéticamente).
  • Esto es algo a tener en cuenta en la planificación de sus sitios web. ¿Quieres un dominio particular sea el dominio por defecto? ¿Desea que una dirección IP tenga un contenido completamente diferente?

Este artículo se basa en su gran mayoría del siguiente artículo o enlace: http://articles.slicehost.com/2010/5/20/apache-virtual-hosts-on-debian-part-1

Comentarios

Entradas populares de este blog

Consultas SQL basadas en fecha y/o hora

Manejando SQL Server 2005, me encontre que tratando hacer consultas basadas en fechas, obtenía como resultado nada (empty). Esto se debía a que no tenía claro como trabajan los tipos de dato datetime y smalldatetime. Estos dos tipos de datos son muy similares, se diferencia en que datetime es más detallado a la hora de almacenar la fecha. Estas diferencias pueden ser vistas en la siguiente tabla: Tipo Minimo Maximo Precision datetime Ene 1, 1753 media-noche Dic 31, 9999 23:59:59.997 (0.003 segundos hasta la media-noche) Más cercano 3.33 millisegundos smalldatetime Ene 1, 1900 media-noche Jun 6, 2079 23:59 (un minuto hasta la media-noche) Más cercano al mínuto Ambos, representan una fecha y hora que es igual al número de días en relación a una fecha base. En SQL Server la fecha base es la medianoche del 1 de Enero de 1900 . Observando la tabla, el tipo de dato smalldatetime, puede solo representar fechas desde esta fech...

AJAX: Redireccionar a una nueva página después de haber iniciado sesión

Estaba trabajando en una app, la cual quería que mostrará un mensaje cada vez que el usuario por error introducía el nombre de usuario o contraseña inválida. Bueno esto no fue díficil, ya que conozco como hacerlo. Pero lo que en ese momento no habia pensado era lo contrario, si el usuario introduce correctamente sus datos, no debo mostrar ningún mensaje. Lo que debo hacer es redireccionar al usuario a su pantalla inicial luego del logeo.

Ajax - Tedioso Error: "Could not complete the operation due to error c00ce514"

Yo tuve de 9:30 AM hasta las 2:00 PM del día de hoy tratando de resolver este bendito error. Busque en Google y nada, asi que me tome la molestía de resolver este problema. Revise las funciones Ajax habitual, donde uno hace el statechanged y luego el open del objeto XmlHttp. Estas son las mías (lo hago para dar una referencia más clara): xmlHttp.onreadystatechange = function() { stateChanged(xmlHttp, placeHolder) } xmlHttp.open(method, url, true); Y nada. Hasta que me pude dar cuenta que en mi caso el bendito error salia porque el mensaje que queria desplegar en el "Place Holder" (no se como decirlo en español), tenía tilde y la letra Ñ-ñ. Asi que al parecer el Ajax no se lleva bien con caracteres fuera del alfabeto gringo. Te tocará a ti, decirme si realmente esto es un bugs o existe alguna forma de configurar en cualquiera de las capaz involucradas en el funcionamiento del Ajax para que este problem no se presente.