HAProxy es una herramienta de servicios proxy y equilibrio de carga de alta disponibilidad de código abierto para aplicaciones de red basadas en TCP y HTTP. Es fácil de usar, se adapta a sitios web de gran volumen y se integra perfectamente en las arquitecturas existentes. Ofrece conexiones transparentes, descarga de servidores, aplicación de políticas, conexiones limitadas además de su función principal de servicio de proxy. En este artículo explicamos cómo configurar haproxy en Ubuntu 16.04.
1. Configurar red
Agregaremos tres servidores web que se ejecutan con Apache2 y un servidor HAPROXY que representará todas las solicitudes/respuestas de los tres servicios web en nuestra red.
A continuación se enumeran los detalles del servidor web en nuestra red.
Server 1: site1.local 10.0.1.116
Server 2: site2.local 10.0.1.117
Server 3: site3.local 10.0.1.119
Servidor HAProxy:
load-balancer.local 10.0.1.118
También adjuntaremos una IP pública a load-balancer.local para acceder desde el dominio público (opcional). Si no desea acceder desde el dominio público, puede omitir adjuntar la IP pública, suponiendo que accederá al servidor proxy dentro de su red.
2. Configurar nombre de host
Dado que vamos a acceder al equilibrador de carga y al servidor web por su nombre (no por IPADDRESS), configuraremos el nombre de host de tres servidores web y un servidor proxy. Configuraremos el nombre de host de tres servidores web y el servidor proxy como site1.local, site2.local, site3.local y load-balancer.local respectivamente.
Configuraremos el nombre de host de 10.0.1.116 como site1.local en /etc/hosts y /etc/hostname
root@site1:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.116 site1.local
root@site1:~# vi /etc/hostname
site1.local
Reiniciar red
root@site1:~# service networking restart
Instale apache y actívelo.
root@site1:~# apt-get install apache2
root@site1:~# service apache2 enable
root@site1:~# service apache2 start
Cree un archivo de índice para site1.local
root@site1:~# vi /var/www/html/index.html
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Agregar regla de firewall para http
# ufw allow 80/tcp
# ufw reload
Ahora comprueba si puedes acceder al sitio 1
root@site1:~# curl -I site1.local
HTTP/1.1 200 OK
Date: Sun, 14 Aug 2016 14:30:29 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Sun, 14 Aug 2016 03:50:35 GMT
ETag: "ec-53a0004a26c6d"
Accept-Ranges: bytes
Content-Length: 236
Vary: Accept-Encoding
Content-Type: text/html
O
root@site1:~# curl site1.local
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
Repita el paso 2 para el sitio 2 ( 10.0.1.117 ) y el sitio 3 ( 10.0.1.119 ).
En el servidor proxy, agregue la entrada de los tres servidores web ( IPADDRESS HOSTNAME ) aparte de su propio nombre de host como load-balancer.local
root@load-balancer:~# vi /etc/hosts
127.0.0.1 localhost
10.0.1.118 load-balancer.local
10.0.1.116 site1.local
10.0.1.117 site2.local
10.0.1.119 site3.local
Configurar el nombre de host del servidor proxy
root@load-balancer:~# vi /etc/hostname
load-balancer.local
3. Instalar HAProxy
Antes de instalarlo actualiza Ubuntu. Ejecute el siguiente comando como root o use sudo para actualizar ubuntu.
root@load-balancer:~# apt-get update
Ahora actualice los paquetes en el sistema.
root@load-balancer:~# apt-get upgrade
Instálelo ejecutando el siguiente comando en la terminal.
root@load-balancer:~# apt-get install haproxy
Para habilitar el servicio como demonio, edite /etc/defaults/haproxy y agregue la siguiente línea.
HABILITADO=1
root@load-balancer:~# vi /etc/defaults/haproxy
ENABLED=1
# Add extra flags here
#EXTRAOPTS="-de -m 16"
Iniciar el servicio
root@load-balancer:~# service haproxy start
4. Configurar HAProxy
El archivo de configuración se encuentra en /etc/haproxy/haproxy.cfg y tiene dos partes, global y proxies, la sección global establece los parámetros de todo el proceso y la sección de proxy consta de las secciones predeterminadas, de escucha, de front-end y de back-end.
Edite el archivo de configuración con el editor de texto vi
root@load-balancer:~# vi /etc/haproxy/haproxy.cfg
El archivo de configuración predeterminado tendrá un aspecto similar al siguiente. Mantenga la sección global y predeterminada como está.
Sección global
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH
+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3
Sección predeterminada
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
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
Agregar oyente:
Una sección de "front-end" describe un conjunto de conectores de escucha que aceptan conexiones de clientes. El front-end define cómo se deben manejar y enviar las solicitudes al servidor back-end:
frontend Local_Server
bind 10.0.1.118:80
mode http
default_backend My_Web_Servers
Adición de servidores web back-end:
Una sección de "back-end" describe un conjunto de servidores a los que se conectará el proxy para reenviar las conexiones entrantes. Según la configuración anterior, el balanceador de carga ahora está escuchando en el puerto 80. Ahora defina los servidores web back-end donde enviará la solicitud.
backend My_Web_Servers
mode http
balance roundrobin
option forwardfor
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
option httpchk HEAD / HTTP/1.1rnHost:localhost
server site1.local 10.0.1.116:80
server site2.local 10.0.1.117:80
server site3.local 10.0.1.119:80
Puede agregar el parámetro "verificar" al final de las tres líneas anteriores para verificar el parámetro de salud de sus servidores web.
Puede usar otro algoritmo de equilibrio según sus requisitos.
Leastconn
Selecciona el servidor con la menor cantidad de conexiones; se recomienda para sesiones más largas. Los servidores en el mismo backend también se rotan de forma rotativa.
Fuente
Esto selecciona qué servidor usar en función de un hash de la IP de origen, es decir, la dirección IP de su usuario. Este es un método para garantizar que un usuario se conecte al mismo servidor.
Habilitar estadísticas (opcional)
Ahora, si lo desea, puede habilitar las estadísticas agregando lo siguiente en el archivo de configuración.
listen stats
bind :9000
stats enable
stats hide-version
stats refresh 20s
stats show-node
stats uri /stats
5. Reiniciar HAProxy
Ya que ha terminado con todas las configuraciones necesarias para el servidor proxy, verifique el archivo de configuración antes de reiniciar el servicio usando el siguiente comando.
root@load-balancer:~# haproxy -c -f /etc/haproxy/haproxy.cfg
Si el comando anterior devolvió el resultado como "el archivo de configuración es válido", reinicie el servicio HAProxy
root@load-balancer:~# service haproxy restart
Ahora comprueba el estado del servidor HAProxy.
root@load-balancer:~# service haproxy status
6. Probar HAProxy
Antes de realizar la prueba, asegúrese de poder hacer ping al servidor web (site1.local, site2.local, site3.local) desde load-balancer.local
root@load-balancer:~# ping site1.local
PING site1.local (10.0.1.116) 56(84) bytes of data.
64 bytes from site1.local (10.0.1.116): icmp_seq=1 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=2 ttl=64 time=0.906 ms
64 bytes from site1.local (10.0.1.116): icmp_seq=3 ttl=64 time=0.648 ms
root@load-balancer:~# ping site2.local
PING site2.local (10.0.1.117) 56(84) bytes of data.
64 bytes from site2.local (10.0.1.117): icmp_seq=1 ttl=64 time=3.02 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=2 ttl=64 time=0.687 ms
64 bytes from site2.local (10.0.1.117): icmp_seq=3 ttl=64 time=0.778 ms
root@load-balancer:~# ping site3.local
PING site3.local (10.0.1.119) 56(84) bytes of data.
64 bytes from site3.local (10.0.1.119): icmp_seq=1 ttl=64 time=0.830 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=2 ttl=64 time=0.631 ms
64 bytes from site3.local (10.0.1.119): icmp_seq=3 ttl=64 time=0.771 ms
Prueba HAPROXY usando CURL
Para probar, ejecute el siguiente script desde la terminal, encontrará que el balanceador de carga está enviando solicitudes a tres servidores web en un método de turno rotativo.
root@load-balancer:~# while true; do curl http://10.0.1.118; sleep 1; done
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.119 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.116 </h1>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1> Hi, This is 10.0.1.117 </h1>
</body>
</html>
...............................
...............................
...............................
Prueba en navegador:
Dirija su navegador a http://load-balancer.local o http://Server-Public-IP y obtendrá una respuesta de tres servidores web de forma rotatoria para confirmar que funciona según nuestras expectativas. Con cada actualización, el servidor proxy envía solicitudes al servidor web back-end una por una.
También puede visitar la URL de estadísticas que está configurada en la última sección del archivo de configuración para confirmar que los puertos están abiertos para el tráfico. Simplemente navegue a IP pública o http://load-balancer.local en el puerto 9000.
Por ejemplo, vaya a http://load-balancer.local:9000/stats

También puede monitorear el estado del servidor desde la terminal usando HATOP. HATOP es una herramienta de terceros que extrae las estadísticas de un archivo de socket creado por el equilibrador de carga. Instale HATOP ejecutando el siguiente comando desde la terminal.
root@load-balancer:~# apt-get install hatop
Normalmente, al ejecutar HATOP, debe usar el parámetro -s con el comando sudo hatop -s /var/run/haproxy.sock. Para evitar tener que ingresar el parámetro -s al llamar a HATOP, puede insertar la siguiente línea en su archivo ~/.bashrc:
exportar unix-socket=/var/run/haproxy.sock
7. Registro de HAProxy
Edite /etc/rsyslog.d/haproxy.conf y agregue las siguientes líneas.
local0.* -/var/log/haproxy_0.log
local1.* -/var/log/haproxy_1.log
Reiniciar rsyslog
root@load-balancer:~# service rsyslog restart
Ahora verifique los registros usando el siguiente comando
root@load-balancer:~# tail -f /var/log/haproxy*.log
También agregue la línea "depuración" en la sección global del archivo de configuración para el registro detallado.
Conclusión
Con HAProxy, puede aumentar el rendimiento y la disponibilidad de su aplicación web. Este tutorial es solo una introducción al equilibrio de carga, aunque es capaz de hacer mucho más de lo que se describe en este tutorial. Puede mejorar la alta disponibilidad configurando una IP flotante entre varios balanceadores de carga para protegerse contra fallas en un solo balanceador de carga.