Esta vez traigo un manual de como gestionar varios dominios con una misma Dirección IP con en el servidor web Apache, algo habitual en Hosting Compartido una solución ideal en entornos de prueba incluso en producción para ofrecer un nivel extra de Seguridad.
El servidor Apache HTTP es un servidor web de codigo abierto para plataformas Unix-like, Windows incluso Mac incluye protocolos HTTP y opción de Sitio Virtual. Es el servidor web más popular del mundo (Desde 1996) ya que es muy estable además de seguridad optima (siendo bien configurado). Apache es el servidor que sigue siendo desarrollado bajo programadores de Apache Software Foundation.
Entre las principales características se encuentran:
- Seguridad SSL y TLS para conexiones cifradas (HTTPS).
- SGDB (Autentificacion de datos).
- Soporte con lenguajes de programación como perl, php, python.
El termino virtual hosts hace referencia a la practica de correr una o mas web de diferentes dominios en una misma direccion IP utilizando la redireccion de puertos de manera interna para cada dominio. Se podria definir a un Virtual Host como el metodo de una empresa de envios para transferir cada paquete a la sucursal correspondiente, apache fue uno de los primeros servidores web en soportar host virtuales basados en IP sin instalar algun plugin adicional. Después de la version 1.1 se añade soporte a la creacion de Host Virtuales basados en IP y en nombres.
Apache soporta 2 formas para configurar un virtualhost:
- Por IP
- Por nombres de dominio
El hosting virtual basado en nombres es normalmente más sencillo, es el que aplicaremos en el laboratorio tan solo es necesario configurar el Servidor DNS sea externo o local para que apunte a nuestro servidor que se encargará de filtrar la cabecera HTTP y en función de ello redirigir al sitio adecuado. La mayor ventaja es que puedes reducir dramáticamente el numero de direcciones IP por dominio caso contrario por la redireccion por IP en donde necesitarías una IP Publica por cada sitio diferente. Tendrás situaciones en que no podrás implementar el hosting basado en nombres por diferentes razones que se listaran:
- Algunos navegadores web antiguos no son compatibles con el hosting virtual basado en nombres. Para que el hosting virtual basado en nombres funcione, el cliente debe enviar la cabecera de Host HTTP.
- El hosting virtual basado en nombres no se puede usar junto con SSL Si lo que quieres es implantar HTTPS no es tu opción.
- Algunos sistemas operativos y algunos elementos de red tienen implementadas técnicas de gestión de ancho de banda que no pueden diferenciar entre hosts a no ser que no estén en diferentes direcciones IP.
Para configurar el Host Virtual es necesario instalar el servidor Apache el cual viene incluido en los Repositorios de Ubuntu.
sudo ap-get install apache2Una vez instalado podemos correrlo con:
sudo service apache startCreamos un usuario sin derechos de Administrador que sera el dueño de los archivos del servidor web:
useadd fulanitopasswd fulanito#Introducimos la contraseña para el usuarioAsí estará sin permisos administrator.
Debemos crear la estructura de los directorios que mantendrán la información de los sitios.
Nuestro documento raíz debe ser configurado en los directorios individuales que suelen ir dentro de la ruta /var/www. Aquí crearemos los directorios para los dos Hosts Virtuales que configuraremos de forma de ejemplo. Para crear el directorio se puede utilizar la opción -p del comando mkdir, de manera que creará todos los directorios y subdirectorios necesarios.
sudo mkdir -p /var/www/fulanito.com/httpdocssudo mkdir -p /var/www/menganito.com/httpdocsEste será el directorio raiz de los 2 Dominios.
Para dar permisos al usuario para que pueda trabajar con los ficheros de los directorios, recomiendo utilizar el usuario non-root que hemos creado y adicional habilitar su acceso por FTP o SFTP
sudo chown -R fulanito.fulanito /var/www/fulanito.com/httpdocssudo chown -R menganito.menganito /var/www/menganito.com/httpdocsTu servidor ahora tiene los permisos necesarios para mostrar el contenido, y el usuario deberá ser capaz de crear contenido en los directorios a medida que sea necesario.
Crear la pagina de inicio
Solo vamos a hacer una demostración, así que nuestras páginas serán muy simples. Solo crearemos un archivo index.html para cada sitio.
sudo touch /var/www/fulanito.com/public_html/index.htmlsudo touch /var/www/menganito.com/public_html/index.htmlEmpezamos con el archivo de fulanito para eso usamos nuestro editor preferido en mi caso vim.
sudo vim /var/www/fulanito.com/public_html/index.html
<html> <head> <title>Haz entrado al sitio de Fulanito</title> </head> <body> <h1>Perfecto! Ya tiene configurado el Host Virtual de Fulanito </h1> </body></html>Guardamos el archivo con :wq en caso de usar vim y empezamos con menganito.
sudo vim /var/www/menganito.com/public_html/index.html
<html> <head> <title>Haz entrado al sitio de Menganito</title> </head> <body> <h1>Perfecto! Ya tienes configurado el Host Virtual de Menganito</h1> </body></html>Guardar el fichero y salir del editor.
Los archivos Virtual Host son archivos que contienen información y configuración especifica para cada dominio por ejemplo podemos tener una configuración global del Apache y unas opciones independientes para un dominio en especifico.
Apache incluye un archivo Virtual Host por defecto denominado 000-default.conf que podemos usar para saltarnos al punto. Realizaremos una copia para trabajar sobre ella y crear nuestro Virtual Host para cada dominio.
Iniciaremos con un dominio, configurado, copiarlo para el segundo dominio, y después realiza los ajustes necesarios. La configuración por defecto de Ubuntu requiere que cada archivo de configuración de Virtual Host termine en .conf.
Crear el Virtual Host de Fulanito
Empezamos por copiar el archivo por default de apache que trae por defecto y utilizarlo como base.
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/fulanito.com.confLuego lo editamos y cambiamos los valores por nuestro dominio y ubicacion raiz.
sudo vim /et/apache2/sites-available/fulanito.comEditaremos el nombre del dominio que va a utilizar el host virtual que en este caso es fulanito.
ServerName fulanito.comSi queremos que nuestro sitio sea accesible a través de mas de un nombre de dominio (practica usada por google), debes añadirlo en el ServerAlias, de la siguiente forma.
<VirtualHost *:80> ServerName fulanito.com ServerAlias www.fulanito.com fulanitooo.com www.fulanitooo.com ...Recuerda que debes tener acceso a los dominios públicos que añadas en ServerAlias, en mi caso no hará falta porque será todo en local.
Lo próximo sera añadir el correo del webmaster que sera el encargado de la administración.
ServerAdmin webmaster@fulanito.comY Añadir la carpeta Raiz de nuestro Dominio.
DocumentRoot /var/www/fulanito.com/httpdocs
Crear el Virtual Host de Menganito
Seguimos esta vez con el dominio de menganito y copiaremos directamente del archivo de fulanito.
sudo cp /etc/apache2/sites-available/fulanito.com.conf /etc/apache2/sites-available/menganito.com.confEditamos para que quede así:
<VirtualHost *:80> ServerAdmin admin@menganito.com ServerName menganito.com ServerAlias www.menganito.com DocumentRoot /var/www/menganito.com/httpdocs ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>Guardamos los cambios.
Debemos habilitar el acceso de los nuevos sitios para que Apache los tome en cuenta luego de reiniciar usamos:
sudo a2ensite fulanito.comsudo a2ensite menganito.comPor ultimo reiniciar el servidor Apache:
sudo service apache2 restartEs posible que el sistema muestre un mensaje parecido a este:
Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerNameComo se trata de un mensaje de advertencia, no tenemos problemas y no impedirá que accedamos a los nuevos sitios.
Este paso es opcional, en caso de tener acceso a dominios públicos pagados podemos saltar el paso, en mi caso como es un lab y los dominios son falsos debo editar el archivo /etc/hosts de mi maquina local.
En caso de Linux debemos editar el archivo:
sudo vim /etc/hostsEn caso de windows debemos editar con el bloc de notas en modo administrador el archivo:
C:\Windows\System32\drivers\etc\hostsEl cualquiera de los Sistemas Operativos el archivo es muy similar y debemos añadir al final los dominios:
# Host Database## localhost is used to configure the loopback interface# when the system is booting. Do not change this entry.##127.0.0.1 localhost#Virtual Hosts 127.0.0.1 fulanito.com127.0.0.1 menganito.com...Esto resulta muy útil mientras se está desarrollando el sitio web antes de subirlo al servidor, de manera que se puede navegar y probar igual que si lo hace en real.
Para que los cambios hechos en el fichero /etc/hosts surtan efecto, se puede ejecutar el siguiente comando:
sudo /etc/init.d/networking restart
La tarea de los Vhost es muy común y repetitiva para finalizar añado un pequeño script en bash para que puedas automatizar esta tarea en servidores con ubuntu de manera mas rápida.
#!/bin/bash TEXTDOMAIN=Example.com ### Definir los Argumentos por este orden Accion, Dominio y Directorio Raiz. action=$1 domain=$2 rootDir=$3 owner=$(who am i | awk '{print $1}') email='webmaster@localhost' sitesEnable='/etc/apache2/sites-enabled/' sitesAvailable='/etc/apache2/sites-available/' userDir='/var/www/' sitesAvailabledomain=$sitesAvailable$domain.conf ### NO MODIFICAR if [ "$(whoami)" != 'root' ]; then echo $"No tienes permisos para correrlo $0 al ser un usuario sin privilegios. Use sudo" exit 1; fi if [ "$action" != 'create' ] && [ "$action" != 'delete' ] then echo $"Debes especificar una accion {create, delete}" exit 1; fi while [ "$domain" == "" ] do echo -e $"Introducir un dominio por ejemplo example.com" read domain done if [ "$rootDir" == "" ]; then rootDir=${domain//./} fi ### if root dir starts with '/', don't use /var/www as default starting point if [[ "$rootDir" =~ ^/ ]]; then userDir='' fi rootDir=$userDir$rootDir if [ "$action" == 'create' ] then ### check if domain already exists if [ -e $sitesAvailabledomain ]; then echo -e $"El dominio ya existe por favor añadir otro." exit; fi ### check if directory exists or not if ! [ -d $rootDir ]; then ### create the directory mkdir $rootDir ### give permission to root dir chmod 755 $rootDir ### write test file in the new domain dir if ! echo "<?php echo phpinfo(); ?>" > $rootDir/phpinfo.php then echo $"ERROR: Permisos insuficientes para escribir en el directorio $userDir/$rootDir/phpinfo.php. Verificar tus permisos" exit; else echo $"Added content to $rootDir/phpinfo.php" fi fi ### create virtual host rules file if ! echo " <VirtualHost *:80> ServerAdmin $email ServerName $domain ServerAlias $domain DocumentRoot $rootDir <Directory /> AllowOverride All </Directory> <Directory $rootDir> Options Indexes FollowSymLinks MultiViews AllowOverride all Require all granted </Directory> ErrorLog /var/log/apache2/$domain-error.log LogLevel error CustomLog /var/log/apache2/$domain-access.log combined </VirtualHost>" > $sitesAvailabledomain then echo -e $"There is an ERROR creating $domain file" exit; else echo -e $"\nNew Virtual Host Created\n" fi ### Add domain in /etc/hosts if ! echo "127.0.0.1 $domain" >> /etc/hosts then echo $"ERROR: Not able to write in /etc/hosts" exit; else echo -e $"Host added to /etc/hosts file \n" fi if [ "$owner" == "" ]; then chown -R $(whoami):$(whoami) $rootDir else chown -R $owner:$owner $rootDir fi ### enable website a2ensite $domain ### restart Apache /etc/init.d/apache2 reload ### show the finished message echo -e $"Complete! \nYou now have a new Virtual Host \nYour new host is: http://$domain \nAnd its located at $rootDir" exit; else ### check whether domain already exists if ! [ -e $sitesAvailabledomain ]; then echo -e $"This domain does not exist.\nPlease try another one" exit; else ### Delete domain in /etc/hosts newhost=${domain//./\\.} sed -i "/$newhost/d" /etc/hosts ### disable website a2dissite $domain ### restart Apache /etc/init.d/apache2 reload ### Delete virtual host rules files rm $sitesAvailabledomain fi ### check if directory exists or not if [ -d $rootDir ]; then echo -e $"Delete host root directory ? (y/n)" read deldir if [ "$deldir" == 'y' -o "$deldir" == 'Y' ]; then ### Delete the directory rm -rf $rootDir echo -e $"Directory deleted" else echo -e $"Host directory conserved" fi else echo -e $"Host directory not found. Ignored" fi ### show the finished message echo -e $"Complete!\nYou just removed Virtual Host $domain" exit 0; fi
Uso del Script para crear un nuevo dominio
Haremos un nuevo vhosts para el dominio zutano.
sudo virtualhost create zutano.com /var/www/zutano.com/httpdocsCon eso estará creado.
Muy interesante todo esto, lo estoy testeando también.