martes, 5 de agosto de 2014

Problema VirtualHost y LocalHost (Ububtu apache2)

Como estaba un poco aburrido decidí crear un servidor casero usando Apache y Ubuntu. Decidí además agregar PHP, MySQL y phpmyadmin. Hasta acá todo bien, la mejor opción, o al menos la más recomendada, era instalar Lamp (Linux, Apache, MySQL, PHP), todo perfecto, pero luego emepzaron los problemas.

Cuando hablo de problemas, para cuando uno quiere aprender sin tener demasiadas ideas, es algo positivo, porque teniendo problemas se aprende, y si estás leyendo esto, es porque también quieres aprender cómo resolver problemas. El problema del problema, es que a veces la gente no tiene nuestros problemas... que quiero decir con esto? que en ocasiones, las respuestas que encontramos, no son las que nosotros necesitamos, pero... pueden ayudarnos a encontrar la solución, voy a pasar a contarles mi caso.

El problema del LocalHost y le VirtualHost.


Ni bien instalamos Apache, ya sea por el uso del lamp-service o solamente Apache, solo basta con arrancar el servicio para que luego al colocar localhost o 127.0.0.1 en la barra de direcciones del buscador ya tengamos Apache funcionado y no hay nada más lindo que leer it's work!!

Ahora bien, si lo que queremos es hacer pruebas de manera local la cosa es fácil, simplemente creamos las carpetas de los sitios que queramos hacer y accedemos a ellas mediante localhost/nombredelsitio y listo vemos nuestras pruebas, pero que pasa si queremos que nuestros sitios aparecan con el nombre que nosotros les queremos asignar, es decir, en vez de localhost diga pepito.com bueno para esto tenemos que crear los servidores virtuales o VirtualHosts.

No voy a hacer un tutorial de cómo hacerlos porque hay mucha info en Internet que podemos usar para darnos cuenta de cómo funciona la cosa. Sin embargo, hubo una curiosidad que me estuvo sacando los pelos de puntas y esto es que, cuando creamos un VirtualHost sobre escribe el localhost. Aunque no sea precisamente este el termino, perdonenme los geeks de la sala.

Para ser más exacto. Yo tengo dos proyectos. Uno es pepito.com y el otro es juanita.com  Yo, trabajando de forma normal, sin crear el VirtualHost, podía acceder a cada uno de los sitios simplemente colocando el nombre de la carpeta correspondiente luego del localhost en la barra de direcciones, pero, al crear un VirtualHost, cada vez que colocaba localhost me redirigía a pepito.com por así decirlo.

Osea, yo quiero acceder al localhost y seguir trabajando con los otros proyectos, no quiero que cada vez que coloque localhost se me abra pepito.com quiero que sea LOCALHOST!!! se entiende?

Bueno, la cosa se complica mucho más, si lo que queremos es que lo que hagamos sea o pueda ser accedido desde el exterior por la IP de nuestra conexión o el nombre del dominio gracias a No-Ip.

Entonces me registre en No-Ip para que alguien más pueda acceder al nombre de dominio que yo asigné en mi VirtualHost y NO A MI LOCALHOST!! (disculpen la rabia).

La cosa es que probé miles de convinaciones y no había caso, cada vez que alguien accedía por el nombre de mi dominio, por ejemplo pepito.noip.org accedía directamente a mi localhost, osea, podía navegar tranquilamente por todas las carpetas que yo tenía dentro del directorio www

A su vez, si yo ponía localhost desde mi navegador, me redirigía a mi VirtualHost asignado, es decir, chau localhost, ahora es pepito.com

Ahora vamos a los papeles.

En Apache tenemos la posibilidad de activar y desactivar los VirtualHost o sitios permitidos que queramos que sean accesibles. Los mismos los podemos ubicar en:

/etc/apache2/sites-available
Ahí van a estar todos los sitios virtuales que nosotros queremos que sean accesibles y allí es donde tenemos que crear nuestros VirtualHosts.

Dije que no iba hacer un tutorial de cómo crear un VrtualHost en Apache2 y Ubuntu, pero para explicar la solución a mi problema, y quizás el tuyo, debo de hacerlo para dejar un poco más en claro, qué es lo que hice, y cuál pudo haber sido mi error.

Como dije, nuestros sitios virtuales debemos de referenciarlos dentro de /sites-available.

Asi que para hacerlo voy a usar el ejemplo de pepito.no-ip.org. Abrimos una terminar (ctrl+alt+t) y colocamos lo siguiente:

sudo gedit /etc/apache2/site-available/pepito.no-ip.org

Y cuando abra el gedit creamos nuestro VirtualHost de la siguiente manera:

<VirtualHost *:80>
       ServerName www.pepito.no-ip.org
       ServerRoot /var/www/pepito.no-ip.org
</VirtualHost>

Guardamos y cerramos el gedit y ya se habrá creado el archivo correspondiente a nuestro servidor virtual. Si bien hay muchas otras cosas que podemos agregar dentro de VirtualHost tan solo con eso, el servidor virtual ya estaría creado.

Ahora voy a tratar de explicarles cada una de las líneas que acabo de escribir arriba.

<VirtualHost *:80>

Con esto, le indicamos a Apache que estamos creando un VirtualHost y que el mismo será accesible por el puerto 80. Si queremos que sea accesible desde el exterior, debemos de abrir el puerto 80 de nuestro router si es que no está abierto (cosa con la que también he luchado pero después otro día les comento.

ServerName www.pepito.no-ip.org

 Con esto, le indicamos a Apache cuál es el nombre que va a tener nuestro sitio. (importante, si queremos que sea accesible desde el exterior por medio de un dominio colocar el nombre del dominio completo, si fuera www.pepito.com, o www.pepito.net, deberíamos de colocarlo tal cual es el nombre del dominio).
 
 ServerRoot /var/www/pepito.no-ip.org

 Aquí le decimos al servidor, en qué lugar se encuentran los archivos de nuestro sitio. (Si la carpeta donde se encuentran los archivos de nuestro sitio se llamara simplemente pepito o estuviera dentro de otra carpeta por ejemplo sitios deberíamos indicar su ruta tal cual.)

</VirtualHost>
De esta forma damos por saber que todo lo referente a nuestro sitio virtual ha terminado (Prestar especial atención a la etiqueta de cierr " </ " dado a que si no cerramos correctamente el servidor nos dará error.)

Ok, ya tenemos nuestro sitio virtual creado ahora debemos de especificarlo dento del archivo host. Para ello vovlemos a abrir una terminal y escribimos:

sudo gedit /etc/hosts

Esto nos permitirá escribiir y agregar nuestro sitio , en el archivo hosts encontraremos algo como lo siguiente:

127.0.0.1    localhost
127.0.1.0    nombre de tu pc
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 ATENCIÓN A ESTO!

Lo que todos nos dicen, es que debemos de agregar unas lineas debajo de 127.0.0.1 localhost con la misma IP y el nombre de nuestro sitio. Vamos a hacerlo.

127.0.0.1    localhost
127.0.0.1    www.pepito.no-ip.org
127.0.0.1    pepito.no-ip.org
127.0.1.0    nombre de tu pc
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
 Presten atención a que he agregado a pepito.no-ip.org CON y SIN www. Esto es para que, si yo escribo en mi navegador, el nombre del sitio, con o sin www me direccione a mi localhost.

Ya casi terminamos con esto, y ahora viene la mejor parte.

Además de la carpeta sites-available en donde se encuentran todos nuestros sitios virtuales también existe la carpeta sites-enabled en donde se le dice a Apache cuales son los sitios que deben de habilitarse y se hace mediante un link a los sitios que se encuentran dentro de sites-available .

Por defecto, dentro de la carpeta sites-available vienen dos archivos, uno llamado default (si instalamos apache de manera individual, sino si instalamos por lamp se llama 000-default) y dafault.ssl. Estos archivos son los que le dicen a Apache que es lo que tiene que cargar cuando nosotros queremos ir a nuestro localhost  los mismos contienen información de todo lo que tenemos a nuestra disposición para utilizar en la creación de nuestros virtual servers.

Pero volvamos a aquello de activar o linkear nuestro sitio dentro de sites-enabled. Vallamos a la consola de nuevo y tecleamos:

sudo a2ensite pepito.no-ip.org
Y reiniciamos Apache con:

sudo service Apache2 restart

Con esto,  lo que hacemos es referenciar y activar al sitio virtual que creamos dento de sites-available desde sites-enabled para que la cosa funcione. Es decir si nosotros colocamos pepito.no-ip.org en la barra de direcciones, debería de ir a la carpeta de nuestro sitio, pero aquí es cuando comienza lo mejor!


El problema con LocalHost y VirtualHost


Ya tenemos nuestro sitio virtual creado, y ya tenemos todo correctamente referenciado. OK, voy a colocar entonces en la barra de direcciones pepito.no-ip.org y veamos que sucede.

It's Work!

Qué pasa con esto? No debería de mostrarse el contenido de pepito.no-ip.org? Por qué se muestra el contenido de Apache en vez del de mi web?

Bien, si recordamos un poco habíamos visto que el comando a2ensite servía para activar un sitio web por decirlo de una forma, aunque esta no es la definición correcta, pero es la que podemos entender. Entonces, habíamos activado nuestro sitio recuerdan? sudo a2ensite pepito.no-ip.org  pero también habiamos visto que dentro de la carpeta sites-available teníamos un archivo denaominado "default" o "000-default" el cual contenía las directivas por defecto de Apache y le decía al servidor cómo debía de actuar o cual es el sitio que debía de cargar primero.

Es decir, si el archivo default, o 000-default está activado, siempre va a ser el primero que va a cargar y en él está asignado que se cargue nuestro local host. Bien, entonces, lo que debemos de hacer, si la lógica no nos falla es deshabilitar el default.

sudo a2dissite default
 Y luego de esto reiniciamos Apache para que se actualicen los cambios.

Ahora probamos entonces colocar en el navegador la dirección ip o el nombre de nuestro dominio virtual, osea www.pepito.no-ip.org veamos que pasa.

Perfecto! Se cargan nuestros archivos.

Podemos acceder entonces desde el nombre del dominio, o exteriormente desde la ip que tengamos asignada en ese momento. Pero qué pasa si colocamos localhost en la barra de direcciones?

APARECEN LOS ARCHIVOS DE PEPITO!!!

Un momento, yo quiero que cuando coloque localhost en la barra del navegador aparezca localhost, poder acceder a mis otros proyectos desde ahí y que no aparezcan los archivos de mi VirtualHost!!

Ok, primero que nada... calma.

Detectando el problema de localhost y VirtualHost

Si recordamos al momento de crear nuestro servidor virtual recordamos que en la primera líne habíamos puesto lo siguiente

<VirtualHost *:80>

Con esto, queremos decir que, todas las direcciones ip que ingresen por el puerto 80, nos dirijan a nuestro servidor local. Entonces, cuando queremos igresar, desde el exterior, por la ip que tengamos asignada, Apache redireccionara automaticamente a nuestro virtual server.  Lo mismo, si queremos acceder a nuestro localhost, dado a qu el mismo está asignado a la dirección IP 127.0.0.1, pero si abrimos el archivo default, veremos que también dice:
<VirtualHost *:80>

Es decir, si activamos el archivo default y el archivo correspondiente a nuestro virtual host, el primero en cargar sería el default, osea el localhost, por eso, cuando tenemos los dos activos, el primero que se ejecuta es el default, porque los dos están escuchando los mismos parámetros, pero el default, tiene prioridad por sobre el resto de los virtual host.  Si desactivamos el default, vamos a poder entrar a nuestro sitio virtual, como hemos visto, pero a su vez, si queremos acceder al local host, ya sea colocando localhost o escribiendo 127.0.0.1 en el navegador, al estar desactivado el dafault el localhost pasaría a ser los archivos de pepito.no-ip.org

La solución definitiva al problema.

Si todavía estás leyendo esto, y lograste entender aunque sea el 10% de lo que acabo de explicar, me considero satisfecho.

La solución entonces para poder acceder a nuestro sitio virtual mediante el nombre del dominio o la dirección ip de nuestra conexión y a su vez, poder acceder al localhost para continuar trabajando con el resto de nuestros proyectos, es: Agregar unas líneas de códigos dentro del archivo default

NameVirtualHost 127.0.0.1
<VirtualHost 127.0.0.1>

Estas son las dos cosas que debemos de cambiar dentro del archivo default, justo al comienzo del mismo. Analizamos la primera.

NameVirtualHost 127.0.0.1

Lo que hacemos con esto es asignarle un nombre y la dirección ip del localhost. Es decir 127.0.0.1.

En la segunda línea:
<VirtualHost 127.0.0.1>

Cambiamos el original que decía <VirtualHost *:80> porque no queremos que todas las direcciones IP tengan acceso a nuestro localhost sino simplemente la que hemos asignado como tal, es decir 127.0.0.1

Ahora bien, para terminar con esto, lo que debemos de hacer es volver a activar el default y resetear el Apache.

Si te mareaste con esto de activar y desactivar sitios para sacarnos las dudas de cual hemos activado y cual no, lo que hacemos es desactivar todos:

sudo a2dissite default
sudo a2dissite pepito.no-ip.org

reiniciamos apache.

sudo service apache2 restart.

Ahora si queremos acceder tanto a localhost como a nuestro sitio, no vamos a poder porque los dos están desactivados. Entonces los activamos...

sudo a2enste default
sudo a2ensite pepito.no-ip.org

reiniciamos apache

sudo service apache2 restart

Y.... tatan! ponemos localhost o 127.0.0.1 y accedemos a nuestro localhost. Colocamos pepito.no-ip.org o la dirección ip de nuestra conexión y accedemos a los archivos de nuestro sitio.

LISTO PROBLEMA SOLUCIONADO!

Esto ha sido demasiado largo, me voy a darme una ducha nos leemos!