Proxy de un sitio web con Apache
Introducción
En Apache existe un módulo llamado mod_proxy que es bastante útil para cumplir con varias funciones. Una de ellas es la de que un servidor reciba tráfico web para un sitio que en realidad está hosteado en otro servidor, que será la que explicaré a continuación.
Para el ejemplo, vamos a suponer:
- Sitio web www.mikroways.net.
- Por DNS, la IP que corresponde al dominio www.mikroways.net es la IPA, donde hay un Apache pero no se encuentra el código del sitio de dicho dominio.
- El servidor web para www.mikroways.net tiene la IPB.
El comportamiento básicamente es el siguiente:
- Un cliente abre una conexión HTTP contra el servidor web en IPA, que según su DNS es el servidor web www.mikroways.net.
- El servidor Apache en IPA acepta la conexión para ese dominio pero en el virtual host correspondiente tiene configurado el mod_proxy que le indica que en realidad el sitio web está en el servidor con IPB. Entonces, el Apache en IPA actúa como cliente haciendo el requerimiento del sitio web de www.mikroways.net a IPB.
- El servidor IPB le devuelve el sitio tal como lo hace con cualquier cliente y lo mismo hace el servidor IPA con su cliente.
Notar que el procedimiento anterior es totalmente transparente tanto para el cliente del servidor IPA como para el propio servidor IPB.
Configuración
A continuación se muestra la configuración del servidor IPA. Notar que en la misma, el valor IPB debe ser reemplazado por la IP del servidor donde realmente se encuentra alojado el sitio web.
<VirtualHost *:80>
ServerName www.mikroways.net
ServerAlias mikroways.net
ServerAdmin invalidaddress@mikroways.net
ProxyPreserveHost On
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://IPB/
ProxyPassReverse / http://IPB/
ErrorLog /var/log/apache2/error.log
TransferLog /var/log/apache2/access.log
</VirtualHost>
Lógicamente debe habilitarse el mod_proxy en Apache y luego reiniciar el servicio para que los cambios tomen efecto. Lo primero se hace muy simple en Debian con el comando:
a2enmod proxy a2enmod proxy_http
Tim Berners Lee llama a continuar con la neutralidad de la web
El inventor de la World Wide Web, Tim Berners Lee, ha escrito un muy interesante artículo para la publicación Scientific American donde explica la importancia de mantener la neutralidad y los estándares abiertos en la web.
En sus reflexiones, Tim Berners Lee indica que la web tal como él la pensó suponía un espacio de intercambio de información en la que cualquier persona pudiera participar aportando contenido propio, de manera sencilla, sin tener que pagar ningún canon por ello ni pedir autorización para hacerlo. Marca que cada nuevo contenido la enriquece y destaca que son fundamentales en la web los enlaces entre diferentes sitios y contenidos, dado que forman una gran red de información, interconectada y disponible para cualquiera.
Especifica que al utilizar estándares abiertos se logra una compatibilidad absoluta entre todos los navegadores, garantizando precisamente el acceso universal a la información, a la vez que se hace posible la utilización de todos los recursos sin necesidad de pagar ningún costo adicional. Contrapone a esta situación el uso de patentes y Web Services propietarios, que limitan la innovación y el desarrollo.
Finalmente, en lo que respecta a neutralidad, es fundamental, según palabras del científico, que no exista por parte de los proveedores ni de los gobiernos ninguna restricción en el tráfico ni que se influencie el mismo, priorizando por ejemplo determinados sitios mientras que se dificulta el acceso a otros. A su vez, el tráfico de un cliente no debería ser inspeccionado bajo ningún punto de vista, ya que no sólo se atenta con ello contra la privacidad sino que también se influencia al cliente y se le limita la libertad.
Dentro de los ejemplos que cita Tim Berners Lee aparecen Facebook y otras redes sociales, que precisamente van en contra del acceso universal a la información por no poder compartir el contenido que se genera con otros portales. De esta manera, Facebook termina convirtiéndose en un monopolio que atrapa cada vez más a sus usuarios debido a que mucha de su producción se encuentra dentro de un lugar del que no es posible exportarla. Esto acrecienta un gran riesgo que es el de fragmentar la red de manera que se formen como islas de contenido separadas, lo que no se condice con los fundamentos principales de la web.
Hasta aquí un resumen del artículo, que es bastante extenso pero su lectura es recomendada por ser una interesante reflexión y porque quien lo escribe tiene la suficiente autoridad para que su opinión sea considerada.
El dominio de Google en la web
En Royal Pigndom han publicado un artículo explicando las áreas de dominio de Google según los diferentes servicios con gráficos que representan la porción del mercado que dicha empresa tiene. Me pareció interesante y por eso quise compartirlo con ustedes.
Levantar un servidor web en menos de 1 segundo
Hoy leí en la columna de Charly Kühnast en Linux Magazine un truco muy simple para iniciar un servidor web teniendo solamente Python instalado. Las ventajas son que Python suele incluirse en todas las distribuciones de Linux, que el servidor se puede ejecutar con cualquier usuario sin privilegios y que el tiempo que toma iniciarlo es menor al que lleva leer este post. Ahora bien, dentro del directorio que se desea publicar por web basta con ejecutar:
python -m SimpleHTTPServer 8080
Si no se especifica el número de puerto por defecto inicia en el 8000.
Nginx + PHP + FastCGI + MySQL + FreeBSD
El objetivo de este post es explicar la configuración mínima para tener funcionando sobre un sistema FreeBSD 8 un servidor web muy liviano con Nginx y FastCGI, con soporte para PHP y MySQL.
Un poco de la arquitectura
Como ya comenté, el servidor web estará basado en un sistema FreeBSD 8 por diferentes motivos:
- Altamente estable.
- Muy seguro en su configuración por defecto.
- Sistema liviano, sin servicios innecesarios ni paquetes de software que no sean indispensables para el funcionamiento del sistema.
Además de lo anterior me gustan los sistemas BSD y también trabajar con diferentes entornos operativos, lo cual también ayudó en la elección.
Para brindar el servicio web el elegido fue Nginx, debido a que es un servidor web muy liviano y estable, capaz de ofrecer alta performance y con una configuración muy sencilla. Como se comenta en su wiki, Nginx es el motor de alrededor del 6.55% de los servidores web del mercado, siendo el backend de varios sitios importantes como WordPress, Hulu, Ohloh, Git HUB, Source Forge y Torrent Reactor.
Ahora bien, para servir los requerimientos de FastCGI se utilizará spawn-fcgi, que es una implementación empaquetada del código escrito originalmente para dar soporte a FastCGI en Lighttpd.
Por su parte, las versiones de MySQL y PHP serán la 5.5 y la 5.3.3 respectivamente, con la primera disponible en los repositorios de FreeBSD. En el caso de PHP, será necesario compilarlo desde los fuentes.
Pasos preliminares
Se asume que se cuenta con un sistema FreeBSD 8 instalado y funcionando correctamente, con los repositorios de paquetes configurados. En el sistema utilizado para este tutorial los únicos servicios que se ejecutan son sendmail (viene por defecto con FreeBSD) y SSH, como se puede ver a continuación:
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN
Instalación del servidor MySQL
Lo primero a instalar será el servidor de bases de datos, dado que es el paso más simple de realizar. Para ello, se instala y se define que se desea permitir que el servicio se inicie y que lo haga automáticamente con el sistema. Dicha acción se define en el archivo /etc/rc.conf. Finalmente se inicia el servicio.
[root@ ~]# pkg_add -r mysql55-server [root@ ~]# vi /etc/rc.conf mysql_enable="YES" [root@ ~]# /usr/local/etc/rc.d/mysql-server start
A continuación puede verse que el servicio está efectivamente esperando por conexiones en el puerto TCP 3306.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Instalación y configuración de Nginx
El servidor nginx está también disponible en los repositorios de paquetes de FreeBSD, con lo cuál para instalarlo basta con ejecutar lo siguiente:
[root@ ~]# pkg_add -r nginx
Ahora bien, si se desea que el servidor sea accesible desde otros lugares es necesario editar el nombre del mismo desde el archivo de configuración de nginx y cambiar el nombre localhost por uno válido o por la IP del servidor.
[root@ ~]# vi /usr/local/etc/nginx/nginx.conf
server_name NOMBRE_SERVIDOR;
Luego, es necesario nuevamente definir el inicio del servicio y arrancarlo.
[root@ ~]# vi /etc/rc.conf nginx_enable="YES" [root@ ~]# /usr/local/etc/rc.d/nginx start
A continuación puede verse que el servicio está efectivamente esperando por conexiones en el puerto TCP 80.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Instalación y configuración de PHP
Como se dijo al principio del post, PHP se instalará desde los fuentes, con lo cuál será necesario cumplir algunas dependencias y luego realizar la compilación. En este caso, PHP se compilará con soporte para zlib, gd y mysql.
[root@ ~]# pkg_add -r gd libXpm [root@ ~]# cd /usr/rsc [root@ /usr/src]# wget -c http://ar2.php.net/distributions/php-5.3.3.tar.bz2 [root@ /usr/src]# tar -xvjf php-5.5.5.tar.bz2 [root@ /usr/src/php-5.3.3]# ./configure --with-zlib --with-gd --with-mysql --with-jpeg-dir=/usr/local/lib --with-png-dir=/usr/local/lib --with-xpm-dir=/usr/local/lib [root@ /usr/src/php-5.3.3]# make [root@ /usr/src/php-5.3.3]# make install
Configurar el soporte para FastCGI
Este paso es muy simple y consiste en instalar spawn-fcgi, configurar su inicio, arrancarlo e indicarle a Nginx que los requerimientos PHP los redirija a dicho servicio. Todo esto se hace como se ve a continuación.
[root@ ~]# pkg_add -r spawn-fcgi [root@ ~]# vi /etc/rc.conf spawn_fcgi_enable="YES" [root@ ~]# /usr/local/etc/rc.d/spawn-fcgi start
Luego de iniciado el servicio, se puede ver que el mismo está efectivamente escuchando en el puerto TCP 9000.
[root@ ~]# netstat -na -p tcp | grep -i listen tcp4 0 0 *.80 *.* LISTEN tcp4 0 0 127.0.0.1.9000 *.* LISTEN tcp4 0 0 127.0.0.1.25 *.* LISTEN tcp4 0 0 *.22 *.* LISTEN tcp6 0 0 *.22 *.* LISTEN tcp46 0 0 *.3306 *.* LISTEN
Ahora sí, finalmente, indicarle a Nginx dos cosas:
- Que considere las páginas index.php como páginas de inicio. Esto se realiza agregando el valor index.php al final de la directiva index.
- Que procese los scripts PHP con spawn-fcgi. Ya existe una configuración que simplemente se debe descomentar para que esto funcione.
[root@ ~]# vi /usr/local/etc/nginx/nginx.conf
index index.html index.htm index.php;
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/nginx/$fastcgi_script_name;
include fastcgi_params;
}
Una aclaración es que la variable fastcgi_param debe indicar el path completo al directorio raíz de nginx, dado que el valor que incluye por defecto no funciona.
Pasos finales
Si se cumplieron todos los pasos anteriores y no surgió ninguna dificultad ya se cuenta entonces con la implementación de la arquitectura planteada funcionando correctamente. Ahora sólo resta publicar los sitios web que se deseen.



