HAPROXY
Introducción
En este documento detallaremos el proceso de instalación y configuración del servicio de balanceo de peticiones HAProxy. Hay que tener en cuenta que no siempre es recomendable su uso, ya que existen otros servicios de balanceo que pueden ser más efectivos según en que entornos (IPVSADM, nginx….)
Enlaces interesantes
Configuración para mucho tráfico: https://medium.freecodecamp.org/how-we-fine-tuned-haproxy-to-achieve-2-000-000-concurrent-ssl-connections-d017e61a4d27
HAProxy Transparent mode: https://armaganyaman.blogspot.com/2015/04/haproxy-transparent-mode-on-centos-7.html
Instalación de HAProxy
Para la instalación de HAProxy, necesitamos realizar la descarga de lo ficheros de source, para descomprimirlos, compilarlos y, posteriormente, instalarlos.
Nos descargamos el tar.gz de ficheros de source del HAProxy del siguiente enlace: http://www.haproxy.org/download/<version>/src/haproxy-<version>.tar.gz
Compilación
cd /install wget http://www.haproxy.org/download/1.9/src/haproxy-1.9.6.tar.gz
A continuación descomprimimos el archivo en /usr/local/src (o en otra ruta si fuera mas pertinente): cd /usr/local/src tar -zxf /install/haproxy-1.9.6.tar.gz
Una vez descomprimido entramos en la carpeta y compilamos el paquete. Con tal de compilar, será necesario instalar los siguientes paquetes:
- gcc
- pcre-static
- pcre-devel
- systemd-devel
- openssl-devel
El comando a usar será el siguiente:
yum install gcc pcre-static pcre-devel systemd-devel openssl-devel
Una vez instalados los paquetes necesarios, empezaremos con la compilación. La linea que debemos usar es la siguiente:
cd /usr/local/src/haproxy-1.9.6 make -j 4 TARGET=linux2628 USE_NS=1 USE_TFO=1 USE_OPENSSL=1 USE_ZLIB=1 USE_PCRE=1 USE_SYSTEMD=1 make install
Una vez instalado el servicio, añadiremos los scripts de arranque del servicio. En este caso la versión de Systemd.
/etc/systemd/system/haproxy.service
[Unit] Description=HAProxy Load Balancer After=network.target
[Service] Environment="CONFIG=/etc/haproxy/haproxy.cfg" "PIDFILE=/run/haproxy.pid" ExecStartPre=/usr/local/sbin/haproxy -f $CONFIG -c -q ExecStart=/usr/local/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE ExecReload=/usr/local/sbin/haproxy -f $CONFIG -c -q ExecReload=/bin/kill -USR2 $MAINPID KillMode=mixed Restart=always SuccessExitStatus=143 Type=notify
[Install] WantedBy=multi-user.target
systemctl daemon-reload
Finalmente, ya podemos empezar con la configuración inicial del servicio de HAProxy.
Configuración de HAProxy
Para configurar correctamente el servicio de Balanceo de peticiones HAProxy, simplemente hay que crear un fichero con la configuración deseada en /etc/haproxy/haproxy.cfg (puede ser en otra ruta, pero esta es la más típica):
/etc/haproxy/haproxy.cfg
global log /dev/log local0 log /dev/log local1 notice maxconn 2000000 chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon nbproc 4 cpu-map 1 0 cpu-map 2 1 cpu-map 3 2 cpu-map 4 3
# Configuraciones generales del servicio defaults log global mode tcp option tcplog option dontlognull maxconn 2000000 timeout connect 3000000 timeout client 6600000 timeout server 6600000 # errorfile 400 /etc/haproxy/errors/400.http # errorfile 403 /etc/haproxy/errors/403.http # errorfile 408 /etc/haproxy/errors/408.http # errorfile 500 /etc/haproxy/errors/500.http # errorfile 502 /etc/haproxy/errors/502.http # errorfile 503 /etc/haproxy/errors/503.http # errorfile 504 /etc/haproxy/errors/504.http
# Configuración de la parte de frontal del servidor (en este caso, en el puerto 80. Es imprescindible configurar la parte de default_backend ya que es a que grupo de servidores va a utilizar para el balanceo) frontend http-in bind *:80 default_backend http-servers
# Configuración de los servidores a los que va a hacer el balanceo backend http-servers mode tcp balance roundrobin server <SERVERNAME> <SERVERIP>:<PORT> send-proxy #p.e: server COOL-AD22 173.230.133.22:9080 send-proxy
# Configuración de la parte de frontal del servidor (puerto 443) frontend https-in bind *:443 default_backend https-servers
# Configuración de los servidores a los que va a hacer el balanceo backend https-servers mode tcp balance roundrobin server <SERVERNAME> <SERVERIP>:<PORT> send-proxy #p.e: server COOL-AD22 173.230.133.22:9443 send-proxy
Una vez creado el fichero ya podremos arrancar el servicio mediante los scripts anteriormente configurados.
Configuración de Frontales
Con la configuración que hemos realizado de HAProxy, es necesario que en los frontales también hagamos algunos cambios. En este caso, al estar configurado con Nginx los cambios serían los siguientes:
Ejemplo de fichero de configuración del virtualhost con el dominio que queramos pasar por el balanceador:
# block for proxy traffic server {
# port elb is forwarding ssl traffic to listen 9443 ssl proxy_protocol; # sets the proper client ip real_ip_header proxy_protocol; # load balancer subnet ip set_real_ip_from 10.0.0.0/16; server_name acme.com www.acme.com; ssl on; ssl_certificate /etc/ssl/acme/acme.com.crt; ssl_certificate_key /etc/ssl/acme/acme.com.key;
}
Como veis lo que hacemos es configurar para que escuche por un puerto diferente para el tráfico que viene del balanceador, ya que ese tráfico viene encriptado con el proxy_protocol:
If you have multiple server blocks running on the same port (virtual hosts), any port that includes proxy_protocol in your nginx configuration will enable proxy protocol handling for ALL traffic on this port, not just the particular server block.