Haciendo magia con HAProxy

En la nueva era de la Internet, donde todos estamos conectados nuestras aplicaciones pueden recibir miles de peticiones en un tiempo muy corto. En la actualidad los servidores en que se despliegan esas aplicaciones o servicios poseen una capacidad de procesamiento muy alta con respecto a computadoras convencionales, sin embargo cuando tenemos múltiples aplicaciones y la carga es demasiada alta es posible que los objetivos no se cumplan y comiencen a existir fallos.

Estos problemas se evitan utilizando balanceadores de carga, cuyo objetivo principal es repartir la carga total de proceso entre varios, de manera que ninguno de ellos llegue a su límite mientras los demás están sin carga. Existen balanceadores de carga por Hardware y Software, en este artículo vamos a hablar sobre uno gratuito llamado HAProxy.

HAProxy es una herramienta gratuita, rápida y fiable y que ofrece un proxy TCP y HTTP de alta disponibilidad con control de balanceo de carga. Este tipo de tecnología es imprescindible para los sitios web con una alta carga de proceso o que generan un gran tráfico.

HAProxy está disponible en la mayoría de las distribuciones GNU/Linux y se instala a través del siguiente comando (CentOS):

yum install -y haproxy

El archivo de configuración principal se encuentra en la siguiente dirección:

vim /etc/haproxy/haproxy.cfg

En este archivo es donde se escriben todas las instrucciones para configurar nuestro balanceador de carga. En este artículo vamos a imaginar el escenario donde usted posee un balanceador de carga y necesita balancear la carga a varios sitios web, además, vamos a establecer la re-dirección SSL desde el propio HAProxy, establecer parámetros de seguridad para ataques DDOS y habilitar la compresión desde el propio balanceador.

Comencemos explicando algunas configuraciones globales que presenta este archivo:

global
    log 127.0.0.1 local2 info
    chroot	/var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group	haproxy
    daemon
    tune.ssl.default-dh-param 2048
    ssl-default-bind-options no-sslv3
    ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

Entre los parámetros globales podemos apreciar la configuración de los logs de manera personalizada para que los registros se escriban en el archivo /var/log/haproxy.log, esto es de suma importancia, pues, por defecto esos registros los lanza para el archivo /var/log/messages (CentOS).

Además podemos apreciar la configuración necesaria para la redirección SSL desde nuestro balanceador de carga.

Para tener una mejor comprensión de lo que vamos a hacer, analicemos la siguiente imagen, donde, vamos a balancear dos aplicaciones web (sitio1 y sitio2), ambas con dos nodos (pueden ser muchos más), sitio2 con protocolo seguro SSL y sitio1 sin SSL.

Vamos a ir describiendo la configuración:

frontend ALL
        bind *:80
        bind *:443 ssl crt /etc/haproxy/certs/

        #1
        acl is_letsencrypt path_beg -i /.well-known/acme-challenge/
        use_backend letsencrypt if is_letsencrypt

        #2
        acl sitio1 hdr_beg(host) -i www.sitio1.com -i sitio1.com
        use_backend sitio1-nodes if sitio1
        
        #3
        acl sitio2 hdr_beg(host) -i www.sitio2.com -i sitio2.com
        use_backend sitio2-nodes if sitio2

En la configuración anterior apreciamos en el #1 la configuración para las actualizaciones de los certificados utilizando Let’s Encrypt (espere un artículo sobre HAProxy y Let’s Encrypt ), en #2 y #3 vemos la configuración para ambos sitios, en dependencia del path_beg redirecciona para un backend-node.

En este mismo bloque agregamos las configuraciones necesarias para la protección DDOS:

        stick-table type ip size 100k expire 30s store conn_rate(3s)
        tcp-request connection reject if { src_conn_rate ge 10 }
        tcp-request connection track-sc1 src

Y agregamos la configuración para establecer la redirección solamente para sitio2 (o sea, todos menos sitio1):

        http-request set-header X-Forwarded-Port %[dst_port]
        http-request add-header X-Forwarded-Proto https if {ssl_fc}
        option httplog
        redirect scheme https if !{ ssl_fc } !is_letsencrypt !sitio1

Una vez realizadas las configuraciones del frontend, vamos a configurar el bloque backend para ambos sitios:

backend sitio1-nodes
        compression algo gzip
        compression offload
        compression type text/html text/plain text/css text/javascript
        mode http
        option forwardfor
        balance roundrobin
        server sitio1-node1 192.168.50.50:80 check
        server sitio1-node2 192.168.50.51:80 check

backend sitio2-nodes
        compression algo gzip
        compression offload
        compression type text/html text/plain text/css text/javascript
        mode http
        option forwardfor
        balance roundrobin
        server sitio2-node1 192.168.50.100:80 check
        server sitio2-node2 192.168.50.101:80 check

Para esta configuración se está utilizando como algoritmo de balanceo Round-Robin, pero es posible utilizar los métodos Weighted Round-Robin, Least Connection o Weighted LeastConnection. Además están presentes las configuraciones para la compresión http.

Espero te haya sido útil este artículo, si fue así puedes invitarme un café.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

SACAViX Tech