Saludos comunidad, me gustaría hacer esta pregunta antes de comenzar este pequeño tutorial, ¿quién no se ha encontrado desarrollando una aplicación web y ha tenido la necesidad de crear un virtualhost para que nuestro entorno de desarrollo sea lo más parecido al de producción?, en mi caso particular me ha sucedido bastante, así que deseo compartir el procedimiento a seguir con todos ustedes.
Antes de ir a lo práctico siempre debemos ver algo de teoría para aquellos que no están muy empapados en el tema.
Apache
Apache es un servidor web, considerado uno de los más populares para proveer contenido web en Internet. Este cuenta con más de la mitad de todos los sitios web activos en la red y es extremadamente poderoso y flexible. Apache divide su funcionalidad y componentes en unidades independientes que pueden ser configuradas independientemente. La unidad básica que describe un sitio individial o el dominio es conocido como virtualhost.
Estas asignaciones permiten al administrador utilizar un servidor para alojar varios dominios o sitios en una simple interface o IP utilizando un mecanismo de coincidencias. Esto es relevante para cualquiera que busque alojamiento para más de un sitio en un solo VPS.
Antes de empezar
Bueno, conociendo un poco la teoría ya podemos pasar al pollo del arroz con pollo, por decirlo en buen cubano. Lo primero que debemos tener en cuenta para poder realizar esta configuración es instalar Apache y esto lo puedes realizar con la siguiente orden:
sudo apt-get install apache2
Una vez instalado el servidor web, podemos comenzar a configurar. La configuración que llevaré a cabo creará un virtualhost para ejemplo.uci.cu y otro para ejemplo.xetid.cu.
Paso Uno – Crear la Estructura del Directorio
El primer paso que necesitamos es crear la estructura de directorios que mantendrán la información de nuestro sitio.
Nuestro documento raíz (el directorio principal en el cual Apache busca el contenido para mostrar) será configurado en directorios individuales dentro de la ruta /var/www/html (para versiones anteriores a ubuntu 14.10 sería en /var/www). Crearemos los directorios aquí para los dos virtual hosts que pretendemos configurar.
Dentro de cada uno de estos directorios crearemos un directorio denominado public_html el cual mantendrá la información pública del sitio y sus respectivos archivos. Esto nos dará más flexibilidad en nuestro alojamiento.
Creamos los directorios donde se contendrán nuestros virtualhosts:
sudo mkdir -p /var/www/html/ejemplo.uci.cu/public_html sudo mkdir -p /var/www/html/ejemplo.xetid.cu/public_html
Paso Dos – Otorgar Permisos
Ahora tenemos la estructura de los directorios para neustros archivos, pero el usuario root es el propietario de ellos. Si queremos que nuestro usuario regular pueda modificar los archivos en nuestro directorio web, necesitamos cambiar el propietario haciendo lo siguiente:
sudo chown -R $USER:$USER /var/www/ejemplo.uci.cu/public_html sudo chown -R $USER:$USER /var/www/pruebas.xetid.cu/public_html
La variable $USER tomará el valor del usuario con el cual actualmente estás identificado. Al hacer esto, nuestro usuario regular ahora es propietario de los directorios public_html donde se almacenará nuestro contenido.
Debemos además modificar los permisos un poco para asegurarnos que el permiso de lectura pueda ser aplicado a archivos y directorios para que las páginas puedan ser desplegadas correctamente:
sudo chmod -R 755 /var/www/html
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.
Paso Tres — Crear una Página de Prueba para cada Virtual Host
Actualmente tenemos la estructura en su lugar, así que ahora vamos a crear contenido para mostrar. Como solo vamos a hacer una demostración, nuestras páginas serán muy simples. Solo crearemos un archivo index.html para cada sitio.
Empecemos con ejemplo.uci.cu creando un archivo denominado index.html:
nano /var/www/html/ejemplo.uci.cu/public_html/index.html
En este archivo, crea un documento HTML simple que indicara que el sitio está conectado. Mi archivo quedó así:
Bienvenido a Ejemplo.uci.cu! Éxito! El Virtual Host ejemplo.uci.cu esta funcionando!
Guardamos y cerramos el archivo cuando terminemos.
Podemos copiar este archivo y usarlo de base para nuestro segundo sitio escribiendo:
cp /var/www/html/ejemplo.uci.cu/public_html/index.html /var/www/html/ejemplo.xetid.cu/public_html/index.html
Ahora podemos abrir el archivo y modificar la información relevante:
nano /var/www/html/ejemplo.xetid.cu/public_html/index.html
Bienvenido a Ejemplo.xetid.cu! Éxito! El Virtual Host ejemplo.xetid.cu esta funcionando!
Guardamos y cerramos como el en caso anterior. Ahora tienes páginas suficientes para probar tu configuración.
Paso Cuatro — Crear Nuevos Archivos Virtual Host
Los archivos Virtual Host son archivos que contienen información y configuración específica para el dominio y que le indican al servidor Apache como responder a las peticiones de varios dominios.
Apache incluye un archivo Virtual Host por defecto denominado 000-default.conf que podemos usar como base. Realizaremos una copia para trabajar sobre ella y crear nuestro Virtual Host para cada dominio. Iniciaremos con un dominio, lo configuraremos y luego copialo lo copiaremos para el segundo dominio, después realizamos 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 Archivo Virtual Host
Empezemos por copiar el archivo para el primer dominio:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/ejemplo.uci.cu.conf
Abre el nuevo archivo con tu editor como usuario root y eliminamos todos los comentarios que existen dentro del mismo, debería quedar así:
ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
Como podemos ver, no hay mucho aquí. Personalizaremos los datos aquí para nuestro primer dominio y agregaremos algunas directivas adicionales. Esta sección del Virtual Host coincide cualquier peticion que es solicitada al puerto 80, el puerto por defecto de HTTP.
Primero, necesitamos cambiar la directiva ServerAdmin por un correo del administrador del sitio que pueda recibir correos.
ServerAdmin admin@ejemplo.uci.cu
Después de esto, necesitamos agregar dos directivas. La primera llamada ServerName , que establece la base del dominio que debe coincidir para este Virtual Host. Esto será como tu dominio. La segunda, llamada ServerAlias, determina nombres futuros que pueden coincidir y servirse como el nombre base o dominio principal.
ServerName ejemplo.uci.cu ServerAlias www.ejemplo.uci.cu
Lo que resta por cambiar para la configuración básica de un Virtual Host es la ubicación del directorio raíz para el dominio. Ya hemos creado lo que necesitamos, así que solo necesitamos modificar DocumentRoot para apuntarlo al directorio que hemos creado:
DocumentRoot /var/www/html/ejemplo.uci.cu/public_html
En total, nuestro archivo de Virtual Host debe verse así:
ServerAdmin admin@ejemplo.uci.cu ServerName ejemplo.uci.cu ServerAlias www.ejemplo.uci.cu DocumentRoot /var/www/html/ejemplo.uci.cu/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
Guarda y cierra el archivo.
Copia el primer Archivo Virtual Host y cámbialo para el Segundo Dominio
Ahora que tenemos nuestro primer archivo Virtual Host configurado, podemos crear el segundo copiando el primero y realizando los cambios necesarios.
Empecemos por copiarlo:
sudo cp /etc/apache2/sites-available/ejemplo.uci.cu.conf /etc/apache2/sites-available/ejemplo.xetid.cu.conf
Abre el nuevo archivo con privilegios root en tu editor:
sudo nano /etc/apache2/sites-available/ejemplo.xetid.cu.conf
Ahora tenemos que modificar todas las piezas de información para referirnos al segundo dominio. Cuando hayas terminado, deberá verse algo así:
ServerAdmin admin@ejemplo.xetid.cu ServerName ejemplo.xetid.cu ServerAlias www.ejemplo.xetid.cu DocumentRoot /var/www/html/ejemplo.xetid.cu/public_html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined
Guarda y cierra al concluir.
Paso Cinco — Habilita los nuevos Archivos Virtual Host
Ahora que hemos creado nuestros archivos virtual hosts, debemos habilitarlos. Apache incluye herramientas que nos permiten hacer esto.
Podemos usar la herramienta a2ensite para habilitar cada uno de nuestros sitios haciendo esto:
sudo a2ensite ejemplo.uci.cu.conf sudo a2ensite ejemplo.xetid.cu.conf
Cuando hayas concluido, deberás reiniciar Apache para asegurarte de que tus cambios surtan efecto:
sudo service apache2 restart
Paso Seis — Configura Archivos Locales
Como nuestros dominios no están registrados en un servidor DNS, debemos adicionarlos en nuestro fichero hosts para que nuestro sistema los asocie a nuestra dirección ip. Para esto editamos el archivo medianto la orden:
sudo nano /etc/hosts
Los detalles que necesitas agregar son la IP de nuestra computadora, en este caso localhost; seguido del dominio que deseas apuntar a la misma.
127.0.0.1 localhost 127.0.0.1 mysginf.xetid.cu 127.0.0.1 ejemplo.xetid.cu 127.0.0.1 ejemplo.uci.cu 127.0.1.1 L-06582
Esto apuntará directamente cualquier petición para ejemplo.uci.cu y ejemplo.xetid.cu en nuestra computadora y enviarlas a nuestro servidor en 127.0.0.1.
Guardamos y cerramos el archivo.
Paso Siete — Prueba tus resultados
Ahora que tenemos nuestros Virtual Hosts configurados, podemos realizar pruebas de configuración simplemente visitando el dominio que hemos configurado mediante nuestro navegador web, accediendo a la url: http://ejemplo.uci.cu/, deberás ver algo como esto:
Mientras que en la ruta: http://ejemplo.xetid.cu/
Si en ambos sitios funciona bien, entonces has configurado correctamente dos Virtual Hosts en el mismo servidor.
Espero que les sea de ayuda.
Comentarios ( 23 )
Muy completo el tutorial, excelente para todos aquellos que se inician en el desarrollo de aplicaciones web. Solo una cosa. En lugares como la UCI y la empresa donde trabajo es necesario además realizar una configuración en el navegador para que excluya ejemplo.uci.cu y ejemplo.xetid.cu de las direcciones accedidas a través del proxy. Lo más probable es que ya tuvieras excluídas las direcciones *.uci.cu y *.xetid.cu, por eso no fue necesario excluir las de los ejemplos. Posts como este son los que me hacen tener a humaOS como página de inicio en mi navegador. Saludos.
Si quieres evitarte tener que estar añadiendo IPs siempre en el /etc/hosts pueden instalarse dnsmasq que es un súper-light servidor DNS, le dices que resuelva todos los .dev o .local o .localhost a tu 127.0.0.1 y ya cualquier dirección que pongas en el navegador como sitio1.dev o sitio2.local es automáticamente traducida a 127.0.0.1 y el virtualhost de Apache sigue funcionando sin problemas. Esto evita tener que mantener a mano el /etc/hosts 😀
Lo otro en Apache existe el concepto de VirtualDocumentRoot que permite no tener que crear un nuevo virtualhost por cada sitio que vayas a desplegar, por ejemplo todos los sitios de sf2 tienen la misma configuración, en mi caso desarrollo local con el dominio .dev y quiero que todo lo que sea .dev sea un proyecto de sf2 entonces, lo que hace es decirle al apache que cuando haga la petición sitio1.dev o sitio2.dev que vaya a buscar la primera parte del dominio a un directorio específico que se resuelve dinámicamente. Esto combinado con el dnsmasq hace que para un proyecto nuevo de sf2 lo único que tengo que hacer es crear una carpeta “pepe” en un directorio específico, esto automáticamente es resuelto por el dominio de desarrollo pepe.dev. Esto funciona para todos los sitios que puedan tener la misma configuración del virtualhost.
Seria genial si pusieras como hacer esto en Zentyal 4.
Excelente tuto.
El post me parece genial a pesar de q no me gusta mucho Apache por la forma que utiliza para servir las peticiones prefiero Nginx.
La duda que tengo es cuando estableciste el propietario de los sitios q lo haces con $USER, siempre he visto q se utiliza el chown junto con www-data o cualquier otro usuario q encontremos definido mediante $APACHE_RUN_USER en el archivo de configuracion /etc/apache2/envvars pues al final Apache utiliza mediante este usuario los fuentes del sitio,de todas formas la configuracion que aqui propones funciona porque con 755 le das permiso de lectura y ejecucion a otros q ahi se encuentra www-data, es muy comun en el chown hacer algo como $USER:www-data o algo por el estilo…..igual el post esta genial es solo una sugerencia….salu2s
con tutoriales como estos q quiten la internet pal car… jejej
Primeramente muchísimas gracias por el tutorial, muy muy útil y bien explicado!
Ahora vengo a exponer mi duda, ya que es una cosa que nunca he conseguido que funcione. A ver si me podéis echar una mano.
Quiero hacer básicamente algo parecido, pero con tema de puertos, y no consigo hacerlo funcionar. Tengo un server casero con varios servicios, como por ejemplo Subsonic, Calibre server, Webmin, Transmission remoto, etc…
Tengo una página principal que sirve como acceso a cualquiera de esos servicios, pero claro, los links quedan muy mal, y tampoco quiero que se vean los puertos por si alguien más quiere acceder. Para acceder por ejemplo a Subsonic, la dirección es http://xxx.xxx.xxx:4040, pero no quiero que se vea. Me gustaría poder poner http://subsonic.xxx.xxx.xxx y acceder así a Subsonic. Lo mismo con el resto de servicios
Tiene que haber alguna manera de hacerlo pero no lo consigo. Me podríais ayudar a hacerlo?
Un saludo y muchas gracias de nuevo
te tufas, hace rato que estaba buscando un tutorial asi…
Muy buen artículo, hay veces que estas cosas sencillas nos traen dolor de cabeza, pero ahora ya se que en humanos hay un articulo sobre esto, ya no tengo que memorizar todo.
@Guille
@Trabajo
@geek
@Hodlok
@larry
@cyber.js
@Esteban
@Jorge Luis
Muchas gracias a todos por los comentarios, mas tarde me siento a resonder las inquietudes específicas.
Saludos.
@Guille
Excelente acotación, realmente se me pasó por alto.
@Hodlok
Por lo que entendí, por la variante que propongo puedes obetener tus resultados sin ningún problema.
@Heimdall Lo que no sé es lo que debo modificar en mi caso, ya que no es que tenga varias carpetas digamos con cada web, sino que es un tema de puertos. Yo quiero que me abra por ejemplo el remoto de Transmission cuando en el navegador escriba http://transmission.xxx.xxx.xxx, en vez de ser como ahora, que tengo que escribir http://xxx.xxx.xxx:8080, y así ocultar a la gente los puertos, que no me.No sé los archivos que tú indicas cuáles y cómo debo modificarlos
Gracias!
5*
excelente tutorial
me toi rompiendo la cabesa hace rato , huvo una vez q me cargo bien , pero ahora cuando pong la direc , no me muestra nada por falta de permisos , me saka esto
Forbidden
You don’t have permission to access / on this server.
y no se por que , porque le estoi dando todos los permisos
ahh y cuando le pong a2ensite xxx.xx.xx
me dice : ERROR: Site cimex.proy.com does not exist!
osea q el sitio no existe , pq pasa esto??
@Travv
Perdon, asi:
a2ensite cimex.proy.com.conf
@Travv
Es un problema que no he podido resolver, pero es sencillo pues en una publicacion de Eugenia Bahit, publico lo solucion lo que no lo recuerdo, la cosa esta en que apache esta configurado para solo leer los sitios que se encuentren en /var/www/html, el virtual host que apunte a una ruta diferente tendra problemas de permisos.
mmmmm,, ya ,, es q pense q el lio era mio , pq no se como , huvo 1 ves q salio , pero me salio en un lugar donde no lo hiva a dejar fijo , y desp cuando lo camb de lugar , me paso eso y fue un lio ,, bueno si encuentras la solucion has el favor y ponmela ,, gracias ,,
ya , ahora cuando puse el comando del a2ensite bien ya me carga , con el proy en otro lado y todo , al parecer se le kito el chisme con los permisos,, gracias
Me da el siguiente error
root@CiberHost:~# a2ensite web.service.cu
ERROR: Site web.service.cu does not exist!
Es un sitio lo que tengo, en php, esta es la config:
ServerName web.service.cu
ServerAdmin thesecret@mail.service.cu
DocumentRoot /var/www/html/web.service.cu/index
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alguen que tenga respuesta???, gracias de antemano
alguien sabe de ello??
@Travv
Hola, creo que lo primero que debes de revisar es que al menos tengas permiso de lectura hasta la carpeta que contiene el sitio que tratas de publicar mediante el Virtual Host. Si ya tienes estos permisos, entonces creo que en el archivo donde configuraste tu host virtual (cimex.proy.com.conf) debes de agregar lo siguiente:
…
…
AllowOverride All
Allow from All
En este caso, si utilizas la version 2.4 o superior de apache, entonces tendras que reemplazar “Allow from All” por “Require all granted”, esto es necesario para evitar errores tipo 403 (Client denied by server configuration”, etc , etc).
@Nestor
Todo eso que debes agregar debe de ir dentro de la directiva :
Directory “/var/www/html/web.service.cu/index”
AllowOverride All
Allow from All
Directory
Asegurate de escribir bien la directiva(con los signos mayor y menor que abren y cierran la etiqueta), pues al tratar de ponerte aqui el ejemplo correctamente se omiten estos signos..Saludos y espero que te sirva.