martes, mayo 15, 2012

Balanceo de carga web con Apache mod_proxy_server

Tomado de: Enchufado
Esto es un extracto a modo de prueba de concepto para ver cómo funciona el tema del balanceo de carga web con el módulo de Apache mod_proxy_server, así que si quieres algo más completo (p.ej. para gestionar también sesiones/cookies), aquí tienes el enlace de referencia en HowtoForge. Y como no podía ser de otro modo, no puede faltar una referencia tal que la documentación oficial de Apache.org. Manos a la obra.
La explicación teórica breve de esto es sencilla: tendremos un frontend web que será el balanceador, quien inicialmente recibirá todas las peticiones de los clientes, para posteriormente redirigirlas a los backends web que configuremos. Efectivamente, esto será transparente para los clientes. Un gráfico que tomé prestado que ejemplifica esto es el siguiente:
A la derecha figuran los equipos cliente (los que realizan las peticiones web), en el centro tendríamos el equipo balanceador (frontend), quien recibe todas las peticiones, y finalmente éste las distribuiría a los backends en función del algoritmo elegido para tal efecto. En este pequeño ejemplo, toda la configuración que a continuación se detalla se realiza en el frontend.
Primero es preciso habilitar los siguientes módulos:
a2enmod proxy
a2enmod proxy_balancer
a2enmod proxy_http
a2enmod status
/etc/init.d/apache2 restart
A continuación, la configuración simplificada para el Virtualhost de un dominio tal que www.perico.com con balanceo de carga web quedaría tal que:
NameVirtualHost www.perico.com:*


    ServerName www.perico.com
    # Actuamos como reverse proxy, apareciendo a los clientes
    # como un servidor web corriente.
    ProxyRequests Off

    # Acceso sin restringir.
    
      Order deny,allow
      Allow from all
    

    # El recurso balancer-manager será el único servido localmente.
    # El resto, lo pasaremos a balancer://mycluster/, que veremos
    # se trata del recurso de balanceo formado por los backends.
    ProxyPass /balancer-manager !
    ProxyPass / balancer://mycluster/ nofailover=On
    # Reescbirimos la URL en las cabeceras HTTP Location,
    # Content-Location y URI para que en lugar de los requests
    # locales (frontend), figuren como remotos (backends).
    ProxyPassReverse / http://web1.perico.com/
    ProxyPassReverse / http://web2.perico.com/
    # Añadimos miembros (backends) al grupo de balanceo y definimos
    # el método del mismo. En este caso, balancemos por número de
    # requests.
    
      BalancerMember http://web1.perico.com
      BalancerMember http://web2.perico.com
      ProxySet lbmethod=byrequests
    

    # Habilitamos el sencillo interfaz web de management del
    # balanceador. Convendría restringir acceso y protegerlo con
    # contraseña.
    
      SetHandler balancer-manager
      Order deny,allow
      Allow from all
    


Un detalle a destacar es que en el balanceador no vamos a necesitar definir ningún DocumentRoot dado éste no va a albergar ningún contenido. Sólo se dedicará a redirigir las peticiones web a los backends (nodos finales). Reiniciamos el servidor web y si en los backends hay definidos logs de acceso, podemos ver cómo indistintamente el balanceador va repartiendo las visitas que hagamos a la url principal (www.perico.com). Otro modo de verlo es accediendo al recurso /balancer-manager (www.perico.com/balancer-manager) y mirando los valores de Elected y To/From. Además, desde éste último podremos manejar los parámetros de balanceo de cada nodo.