Configuración de hosts virtuales en VPS con CentOS 6.5 en Digital Ocean

En algunas ocasiones, los recurso de un servidor virtual privado (VPS) son excesivas para una sola aplicación. Es decir, una aplicación que recién inicia o que no tendrá muchos usuarios (dado que se usa simplemente para control interno) no utilizará todos los recursos de un servidor con un procesador Intel de 2.4GHz, 512MB de RAM, 20GB de espacio en disco, y 1TB de ancho de banda.

En tales casos es conveniente hacer uso compartido de los recursos del servidor, en tantas particiones como se crea necesario. Para ello, se pueden crear diversos hosts virtuales gracias a Apache. En esta entrada tomaremos los conocimientos adquiridos en despliegue de aplicación Yii en Cloud VPS de Digital Ocean y construiremos los hosts virtuales en un servidor con LAMP ya instalado.

Esta entrada se basa en How To Set Up Apache Virtual Hosts on CentOS 6, la cual es parte de la documentación de Digital Ocean.

Paso 1. Crear los directorios de los hosts virtuales

Primeramente se deben crear los directorios para cada uno de los dominios que van a estar alojados en el servidor, ahora compartido. El comando mkdir crea un directorio, y el argumento -p se encarga de crear todos los directorios intermedios si éstos no existen.

# Primer directorio.
sudo mkdir -p /var/www/ejemplo1.com/public_html
# Segundo directorio.
sudo mkdir -p /var/www/ejemplo2.com/public_html

Para realizar estas pruebas necesitarás acceso a un dominio real al que tengas acceso, para ver cómo se despliega información diferente con cada dominio o subdominio apuntado, pero eso será más adelante.

Paso 2. Permisos

Es necesario cambiar los permisos para que el servidor pueda leer los archivos (y escribir en caso de que la aplicación necesite subir archivos):

# Primer directorio.
sudo chown -R apache:apache /var/www/ejemplo1.com/public_html
# Segundo directorio.
sudo chown -R apache:apache /var/www/ejemplo2.com/public_html

Y para configurar los permisos de lectura, añadimos:

sudo chmod 755 /var/www

Paso 3. Crear contenido de prueba para mostrar

En este paso se crea el contenido que va a ir en el sitio o aplicación web. Para asegurarnos de que todo funciona, sin embargo, primeramente creamos un simple archivo de texto que identifique cada uno de los hosts virtuales. El contenido del archivo de prueba sería:

<html>
	<head>
		<title>Página de ejemplo</title>
	</head>
	<body>
		<h1>¡Saludos desde el host virtual!</h1>
		<h2>(El cual es ejemplo1.com)</h2>
	</body>
</html>

Para crear el archivo de prueba se puede utilizar el editor nano o vi, con el siguiente comando:

# Para vi:
sudo vi /var/www/ejemplo.com/public_html/index.html
#Para nano:
sudo nano /var/www/ejemplo.com/public_html/index.html

Y se repite la misma operación para el segundo hosts (y los sucesivos). No te olvides de cambiar el texto en el archivo de muestra, para saber si efectivamente se muestra contenido diferente para cada host virtual.

Paso 4. Activar los hosts virtuales

Primero, abrimos el archivo a editar:

sudo nano /etc/httpd/conf/httpd.conf

Al final del archivo (en serio, hasta el final) vienen los detalles de la configuración de hosts virtuales, y se ve algo así como lo mostrado en el listado 1.

# 
# Use name-based virtual hosting.
#
#NameVirtualHost *:80
#
# NOTE: NameVirtualHost cannot be used without a port specifier
# (e.g. :80) if mod_ssl is being used, due to the nature of the
# SSL protocol.
#    

#
# 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.
# 
#<VirtualHost *:80>
#    ServerAdmin [email protected] dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

Las líneas marcadas (la 4 y de 17 a 23) son aquellas que deben estar activas, para lo que se elimina el # al inicio (todas las demás permanecen igual). La acción ocurre en las líneas 17 a 23, que hacen los siguiente:

Una configuración de ejemplo, eliminando los parámetros de cambio de ubicación para las bitácoras (logs), sería:

# Host virtual 1.
<VirtualHost *:80>
    ServerAdmin [email protected] ejemplo1.com
    DocumentRoot /var/www/ejemplo1.com/public_html
    ServerName ejemplo1.com
</VirtualHost>

# Host virtual 2.
<VirtualHost *:80>
    ServerAdmin [email protected] ejemplo2.com
    DocumentRoot /var/www/ejemplo2.com/public_html
    ServerName ejemplo2.com
</VirtualHost>

Tras terminar la configuración del servidor, reiniciamos el servidor de Apache:

sudo /etc/init.d/httpd restart

el cual ya estará listo para servir dos páginas o aplicaciones diferentes desde un solo servidor.

Errores comunes

En caso de que al reiniciar el servidor de Apache se muestre el siguiente mensaje:

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[Thu Jul 10 16:34:09 2014] [warn] _default_ VirtualHost overlap on port 80, the first has precedence

en el cual simplemente dice “Tengo varios hosts, pero no sé cómo o cuándo mostrar uno u otro, así que mostraré siempre el primero”, es necesario quitar el comentario de la línea 4 mostrada en el listado 1 (es decir, no está reconociendo los hosts virtuales, por lo que solamente muestra uno).

Paso 5. Editar DNS del dominio

Para este paso se da de alta el dominio o subdominio que apunta a la IP del servidor. Esto ya depende del panel de control de cada uno. Tras declarar los dos registros de DNS (A records) y esperar el tiempo de propagación necesario, se podrán ver reflejados los cambios.

Conclusión

La creación de hosts virtuales permite un menor costo en el manejo de aplicaciones web sin mucha demanda, motivo suficiente para el uso de dicha tecnología. La configuración se reduce a la creación de carpetas contenedoras, gestión de permisos, y edición del archivo de configuración.

En caso de cualquier problema con el uso de hosts virtuales en CentOS 6.5 no dudes en contactarnos, somos desarrolladores apoyando desarrolladores.



Deja un comentario