Cargando



Como crear Virtual Host de Apache en Ubuntu LTS

Como configurar Apache para utilizar varios dominios con solo una dirección IP sin necesidad de un Cpanel o Plesk., lo que viene siendo Virtual Host.


dic 01 2015 18:18
Profesional
dic 03 2015 19:39

apache2.jpg

 

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.

 

¿Que es Apache ?

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.

 

Principales características de Apache

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.

 

¿Que es un Virtual Hosts?

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.

 

Diferencias entre el hosting vitual basado en nombres y el basado en IPs

Apache soporta 2 formas para configurar un virtualhost:
  • Por IP
  • Por nombres de dominio
En la solución por IP apache se fija de la IP del cliente que realiza la petición y de acuerdo al rango de Ip que tengas predefinido puedes entrar al sitio A o B esto en conjunto con un geolocalizador por Ip es muy ventajoso en paginas con varios lenguajes.

 

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.

 

Preparando el Sistema.

Para configurar el Host Virtual es necesario instalar el servidor Apache el cual viene incluido en los Repositorios de Ubuntu.
sudo ap-get install apache2
Una vez instalado podemos correrlo con:
sudo service apache start
Creamos 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 usuario
Así estará sin permisos administrator.

 

Crear Directorio

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/httpdocs
Este será el directorio raiz de los 2 Dominios.

 

Dar Permisos

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/httpdocs
Tu 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.html
Empezamos 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.

 

Crear ficheros de los nuevos Virtual Hosts

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.conf
Luego lo editamos y cambiamos los valores por nuestro dominio y ubicacion raiz.
sudo vim /et/apache2/sites-available/fulanito.com
Editaremos el nombre del dominio que va a utilizar el host virtual que en este caso es fulanito.
ServerName fulanito.com
Si 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.com
Y 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.conf
Editamos 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.

 

Habilitar los nuevos dominios en Apache

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.com
Por ultimo reiniciar el servidor Apache:
sudo service apache2 restart
Es 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 ServerName
Como se trata de un mensaje de advertencia, no tenemos problemas y no impedirá que accedamos a los nuevos sitios.

 

Configurar Hosts

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/hosts
En caso de windows debemos editar con el bloc de notas en modo administrador el archivo:
C:\Windows\System32\drivers\etc\hosts
El 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
Prueba tu servidor Apache

 

 

Script para añadir Host Virtuales

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/httpdocs
Con eso estará creado.

 

Conclusiones
Hemos creado un pequeño lab para 3 dominios falsos que responden a una dirección, al usar vhosts con NAT podemos crear staging sites por ejemplo dev.fulanito.com para hacer modificaciones en una replica sin afectar el sitio original. Los pasos para otras Distros como Centos varian en algunos pasos pero son muy similares cambiando el gestor de paquetes.


¿Te ayudó este Tutorial?


2 Comentarios

Muy interesante todo esto, lo estoy testeando también.

Acabo de usar ciertas partes para poder crear un virtual host de linux. Esta bien planteado. gracias.

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X