Vamos a examinar cómo crear un Host Virtual en Apache bajo Windows, en concreto cómo crear y configurar un Host Virtual usando WAMP, sienda esta una opción popular en desarrollos web bajo Windows.
WAMP no es la única opción para instalar Apache, PHP y MySQL en Windows, hay otros alternativas como lo es EasyPHP o XAMPP. donde este último además nos instala Perl.
Muchas veces es esencial disponer de una forma simple y rápida de probar nuestras aplicaciones web, de un modo medianamente similar a como sería su ejecución en producción. Naturalmente, podemos lograr esto en soluciones como Vagrant creando máquinas virtuales en nuestro ordenador, pero en ocasiones Vagrant no es lo más rápido en su ejecución o simplemente queremos aprovechar la versión de PHP que disponemos localmente con toda su batería de extensiones que nos facilitan la vida.
En las situaciones anteriores, disponer de una solución del tipo WAMP es conveniente. Entonces, para ejecutar nuestras aplicaciones web, una opción directa es crear los proyectos bajo el directorio de publicación de WAMP (Apache), así el esquema de directorios tendría el aspecto:
C:/wamp/www/
|- proyecto_1
|- proyecto_2
|- ...
|- proyecto_i
|- ...
|- proyecto_n
Donde correr un proyecto cualquiera, significa escribir en el navegador la url:
http://localhost/proyecto_i/public/
Ahora esto presenta los siguientes inconvenientes:
- Nuestros proyectos o al menos una copia de ellos, deben colocarse en el directorio de publicación de Apache.
- La urls definitivamente lucen bastantes anómalas, sobre todo si debemos trabajar en nuestro código con urls más realistas, por ejemplo si estamos trabajando en alguna aplicación web del tipo multisitios.
La solución a estos problemas es usar lo que se conocer como VirtualHost de Apache, junto con una característica del sistema operativo.
Requerimientos
Hay varias formas de instalar Virtual Host en Apache, acá lo haremos respetando los siguientes requerimientos:
- Permitir que las herramientas instaladas por WAMP, sean accesibles después de la instalación del Virtual Host. Es decir, que al digitar
http://localhost
se muestre la página inicial de WAMP, con acceso a: phpMyAdmin, phpinfo, entre otros. - Evitar en lo posible eventuales bloqueos de páginas de Internet.
Usaremos la característica de Apache, que le faculta a escuchar las peticiones (url) en más de un puerto. En este caso, haremos que las peticiones a nuestros proyectos web se hagan en el puerto
8080
.
Como interviene Windows en los Virtual Host
La idea es que bajo una petición (url) determinada en el navegador, el sistema (Windows) sea capaz de interceptarla y rutearla al código de nuestra aplicación. Es decir, queremos que una llamada (url) al navegador del tipo:
http://www.mi_aplicacion.com
Sea ruteada a un directorio del tipo:
C:\ivan\proyectos\mi_aplicacion\public\
Lograr lo anterior requiere dos (2) acciones:
- Que el sistema operativo, en este caso, Windows intercepte el llamado del browser
http://www.mi_aplicacion.com
y lo redirija hacia el servicio Apache en nuestro mismo equipo, evitando así que la llamada fluya hacia la internet. - Al recibir esta llamada
http://www.mi_aplicacion.com
, Apache pueda rutearla hacia el punto de entradaC:\ivan\proyectos\mi_aplicacion\public\
de nuestra aplicación que reside localmente.
Windows puede interceptar la petición del navegador y reinterpretarla, esto lo hace con el archivo hosts ubicado:
C:\Windows\System32\drivers\etc\hosts
El archivo hosts no lo podemos editar directamente, pues es un archivo de administración de sistema y además protegido por nuestro antivirus. La manera de resolver este asunto ha sido explicado en el post ‘Host en Windows 7’.
En este caso, y como vamos a definir un puerto 8080
distinto al tradicional de los servicios web (puerto 80
) al archivo hosts le agregamos la línea:
127.0.0.1:8080 mi_aplicacion.com www.mi_aplicacion.com
Si existía alguna aplicación en la internet con la dirección “http://www.mi_aplicacion.com”, ya no será accesible desde nuestro equipo. Así que se debe advertir de esta consecuencia, una manera de resolverla es darle una extensión distinta por ejemplo
http://www.mi_aplicacion.dev
.
Si tenemos varias aplicaciones que deseamos rerutear, las líneas a agregar podrían ser:
127.0.0.1:8080 mi_aplicacion.dev www.mi_aplicacion.dev
127.0.0.1:8080 gestion_de_facturas.dev www.gestion_de_facturas.dev
127.0.0.1:8080 mi_web_service.dev www.mi_web_service.dev
Configurando Virtual Host en Apache
Se aprecia que Windows ruteará al Servidor Web todas las URL’s a la misma IP. Es ahí donde una de las características de Apache toma protagonismo, esta funcionalidad se llama Virtual Host, y permite que Apache pueda diferenciar distintos sitios web que conviven en la misma IP.
En palabras muy breves, en la Internet la petición (url) se pasa a servidores de DNS, cuya función es traducirla, es decir, tomar el dominio de esa url y traducirlo en una dirección IP, para rutear la petición (url) al servidor que es responsable de atenderla. Sin embargo, si tenemos varias aplicaciones trabajando en esa IP usando el Virtual Host el proceso inverso de rueto no es posible, o a lo más es posible para sólo una de las aplicaciones (definida en el reverse DNS), ya que si la petición incluye la IP en vez del dominio, el servidor no tendrá forma de saber cual es la aplicación requerida.
En cualquier stack del estilo de WAMP, podemos activar los virtual host sólo conociendo cual es el archivo de configuración que lee Apache, ese archivo de configuración recibe el nombre de httpd.conf
y contiene toda la información que requerimos para este efecto.
Se está describiendo una forma manual de crear o configurar los Virtual Hosts, aunque en ocasiones se tiene la posibilidad de hacerlo de una manera distinta.
En el archivo httpd.conf
debemos cambiar la línea de esto:
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
Por esto:
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
También le agregamos una segundo puerto que escuchará Apache, quedando la línea del ‘Listen’ del modo:
Listen 80
Listen 8080
También puede ser útil activar el módulo
vhost_alias_module
, esto se lleva a cabo modificando la línea:#LoadModule vhost_alias_module modules/mod_vhost_alias.so
aLoadModule vhost_alias_module modules/mod_vhost_alias.so
.
Luego hay que agregar las líneas de configuración de virtual host, situadas en:
C:\wamp\bin\apache\Apache2.2.21\conf\extra\hhtpd-vhosts.conf
Nota: la ruta para el archivo de configuración de los virtual hosts, se desprende desde la propia línea del
Include
.
Es muy importante, que una vez abierto el archivo httpd-vhosts.conf
, agregue un # a cualquiera definiendo de ejemplo de Virtual Host, por ejemplo en WAMP versión 2.2 figura en el archivo httpd-vhosts.conf
el siguiente código de ejemplo:
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
ServerName dummy-host.example.com
ServerAlias www.dummy-host.example.com
ErrorLog "logs/dummy-host.example.com-error.log"
CustomLog "logs/dummy-host.example.com-access.log" common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
ServerName dummy-host2.example.com
ErrorLog "logs/dummy-host2.example.com-error.log"
CustomLog "logs/dummy-host2.example.com-access.log" common
</VirtualHost>
Esto debe eliminarlo o cambiarlo a:
#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot "c:/Apache2/docs/dummy-host.example.com"
# ServerName dummy-host.example.com
# ServerAlias www.dummy-host.example.com
# ErrorLog "logs/dummy-host.example.com-error.log"
# CustomLog "logs/dummy-host.example.com-access.log" common
#</VirtualHost>
#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host2.example.com
# DocumentRoot "c:/Apache2/docs/dummy-host2.example.com"
# ServerName dummy-host2.example.com
# ErrorLog "logs/dummy-host2.example.com-error.log"
# CustomLog "logs/dummy-host2.example.com-access.log" common
#</VirtualHost>
Agregar al principio la línea el caracter #, hace que Apache ignore esa línea en el archivo de configuración.
Finalmente, para agregar la aplicación en la ruta www.mi_aplicacion.dev
, agregamos las siguientes líneas:
<VirtualHost *:8080>
ServerAdmin webmaster@example.com
DocumentRoot "C:\ivan\proyectos\mi_aplicacion\public"
ServerName www.mi_aplicacion.dev
ErrorLog "C:\ivan\proyectos\mi_aplicacion\logs\error.log"
CustomLog "C:\ivan\proyectos\mi_aplicacion\logs\access.log" common
<Directory "/">
Deny from all
Allow from 127.0.0.1
</Directory>
</VirtualHost>
Notar que los directorios C:\ivan\proyectos\mi_aplicacion\public
y C:\ivan\proyectos\mi_aplicacion\logs\
deben existir, sino Apache no ejecutará el servicio web.
Si tenemos otras aplicaciones web, entonces debemos agregar las líneas anteriores para cada una de las aplicaciones. Opcionalmente podemos cambiar en este archivo la línea de Listen de:
NameVirtualHost *:80
aNameVirtualHost *:8080
.
Y con tan sólo reiniciar WAMP, ya tendremos operando nuestra o nuestras aplicaciones web localmente y con una agradable url del tipo:
http://www.mi_aplicacion.dev:8080
Es preferible evitar la colisión de nombre de la aplicación en desarrollo, con la misma aplicación en producción o testing, a través de manejar un puerto de escucha distinto al ‘80’ en el Servidor Web y además usando una extensión .dev
.