1 de abril de 2016

Crear un Host Virtual en Windows

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:

  1. 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.
  2. Al recibir esta llamada http://www.mi_aplicacion.com, Apache pueda rutearla hacia el punto de entrada C:\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 a LoadModule 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 a NameVirtualHost *: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.