Ir al contenido

Entradas etiquetadas como ‘web’

26
abr

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:

  1. 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.
  2. 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.
  3. 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
24
nov

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.

10
nov

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.

16
oct

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.

1
ago

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.