Introducción
HAProxy, que significa Proxy de Alta Disponibilidad, es un popular software de código abierto para balanceo de carga TCP/HTTP y solución de proxy que se puede ejecutar en Linux, macOS y FreeBSD. Su uso más común es mejorar el rendimiento y la confiabilidad de un entorno de servidor distribuyendo la carga de trabajo entre varios servidores (por ejemplo, web, aplicación, base de datos). Se utiliza en muchos entornos de alto perfil, incluidos: GitHub, Imgur, Instagram y Twitter.
En esta guía, obtendrá una visión general de lo que es HAProxy, revisará la terminología de balanceo de carga y verá ejemplos de cómo podría usarse para mejorar el rendimiento y la confiabilidad de su propio entorno de servidor.
Terminología de HAProxy
Hay muchos términos y conceptos importantes cuando se trata de balanceo de carga y proxy. Repasará los términos comúnmente utilizados en las siguientes subsecciones.
Antes de entrar en los tipos básicos de balanceo de carga, debería comenzar con una revisión de ACL, backends y frontends.
Lista de Control de Acceso (ACL)
En relación con el equilibrio de carga, las ACL se utilizan para probar alguna condición y realizar una acción (por ejemplo, seleccionar un servidor o bloquear una solicitud) en función del resultado de la prueba. El uso de ACL permite un reenvío flexible del tráfico de red basado en una variedad de factores como la coincidencia de patrones y el número de conexiones a un backend, por ejemplo.
Ejemplo de una ACL:
acl url_blog path_beg /blog
Esta ACL se empareja si la ruta de la solicitud de un usuario comienza con /blog
. Esto coincidiría con una solicitud de http://tudominio.com/blog/entrada-de-blog-1
, por ejemplo.
Para obtener una guía detallada sobre el uso de ACL, consulta el Manual de Configuración de HAProxy.
Backend
A backend is a set of servers that receives forwarded requests. Backends are defined in the backend section of the HAProxy configuration. In its most basic form, a backend can be defined by:
- qué algoritmo de equilibrio de carga usar
- a list of servers and ports
A backend can contain one or many servers in it. Generally speaking, adding more servers to your backend will increase your potential load capacity by spreading the load over multiple servers. Increased reliability is also achieved through this manner, in case some of your backend servers become unavailable.
Aquí tienes un ejemplo de una configuración de dos backends, web-backend
y blog-backend
, con dos servidores web en cada uno, escuchando en el puerto 80:
backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check
backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check
La línea balance roundrobin
especifica el algoritmo de equilibrio de carga, que se detalla en la sección de Algoritmos de Equilibrio de Carga.
mode http
especifica que se utilizará el proxy de la capa 7, que se explica en la sección Tipos de Balanceo de Carga.
La opción check
al final de las directivas server
especifica que se deben realizar comprobaciones de salud en esos servidores backend.
Frontend
A frontend defines how requests should be forwarded to backends. Frontends are defined in the frontend
section of the HAProxy configuration. Their definitions are composed of the following components:
- a set of IP addresses and a port (e.g. 10.1.1.7:80, *:443, etc.)
- ACLs
- Reglas
use_backend
, que definen qué backends usar dependiendo de qué condiciones de ACL coincidan, y/o una regladefault_backend
que maneja todos los demás casos
A frontend can be configured to various types of network traffic, as explained in the next section.
. Tipos de Balanceo de Carga
Ahora que tienes una comprensión de los componentes básicos que se utilizan en el balanceo de carga, puedes pasar a los tipos básicos de balanceo de carga.
Sin Balanceo de Carga
A simple web application environment with no load balancing might look like the following:

En este ejemplo, el usuario se conecta directamente a su servidor web, en yourdomain.com
y no hay balanceo de carga. Si su único servidor web se cae, el usuario ya no podrá acceder a su servidor web. Además, si muchos usuarios intentan acceder a su servidor simultáneamente y no puede manejar la carga, pueden tener una experiencia lenta o incluso no poder conectarse en absoluto.
Balanceo de Carga de Capa 4
La forma más simple de balancear el tráfico de red hacia múltiples servidores es usar el balanceo de carga de capa 4 (capa de transporte). Balancear la carga de esta manera reenviará el tráfico de usuario basado en el rango de IP y el puerto (es decir, si llega una solicitud para http://yourdomain.com/anything
, el tráfico se reenviará al backend que maneja todas las solicitudes para yourdomain.com
en puerto 80
). Para más detalles sobre la capa 4, consulte la subsección de TCP de nuestra Introducción a las Redes.
Aquí hay un diagrama de un ejemplo simple de balanceo de carga de capa 4:

El usuario accede al balanceador de carga, que reenvía la solicitud del usuario al grupo de servidores backend web-backend. Cualquier servidor backend seleccionado responderá directamente a la solicitud del usuario. En general, todos los servidores en el grupo web-backend deberían servir contenido idéntico; de lo contrario, el usuario podría recibir contenido inconsistente. Tenga en cuenta que ambos servidores web se conectan al mismo servidor de base de datos.
Balanceo de carga en la capa 7
Otra forma más compleja de balancear el tráfico de red es utilizando el balanceo de carga en la capa 7 (capa de aplicación). Usar la capa 7 permite al balanceador de carga reenviar solicitudes a diferentes servidores backend según el contenido de la solicitud del usuario. Este modo de balanceo de carga le permite ejecutar múltiples servidores de aplicaciones web bajo el mismo dominio y puerto. Para obtener más detalles sobre la capa 7, consulte la subsección HTTP de nuestra Introducción a las Redes.
Aquí hay un diagrama de un ejemplo simple de balanceo de carga en la capa 7:

En este ejemplo, si un usuario solicita yourdomain.com/blog
, se le reenvía al backend blog, que es un conjunto de servidores que ejecutan una aplicación de blog. Otras solicitudes se reenvían a web-backend, que podría estar ejecutando otra aplicación. Ambos backends utilizan el mismo servidor de base de datos, en este ejemplo.
A snippet of the example frontend configuration would look like this:
frontend http
bind *:80
mode http
acl url_blog path_beg /blog
use_backend blog-backend if url_blog
default_backend web-backend
Esto configura un frontend llamado http
, que maneja todo el tráfico entrante en el puerto 80.
acl url_blog path_beg /blog
coincide con una solicitud si la ruta de la solicitud del usuario comienza con /blog
.
use_backend blog-backend if url_blog
utiliza la ACL para dirigir el tráfico al backend blog-backend
.
default_backend web-backend
especifica que todo el otro tráfico se enviará al backend web-backend
.
Algoritmos de Balanceo de Carga
El algoritmo de balanceo de carga que se utiliza determina qué servidor, en un backend, será seleccionado al balancear la carga. HAProxy ofrece varias opciones de algoritmos. Además del algoritmo de balanceo de carga, a los servidores se les puede asignar un parámetro de peso para manipular con qué frecuencia se selecciona el servidor en comparación con otros servidores.
A few of the commonly used algorithms are as follows:
roundrobin
Round Robin selecciona los servidores por turnos. Este es el algoritmo predeterminado.
leastconn
Selecciona el servidor con menos conexiones. Esto se recomienda para sesiones más largas. Los servidores en el mismo backend también se rotan de forma circular.
fuente
Esto selecciona qué servidor utilizar en función de un hash de la dirección IP de origen desde la que los usuarios realizan las solicitudes. Este método asegura que los mismos usuarios se conecten a los mismos servidores.
Sesiones Pegajosas
Algunas aplicaciones requieren que un usuario continúe conectándose al mismo servidor backend. Esto se puede lograr mediante sesiones pegajosas, utilizando el parámetro appsession
en el backend que lo requiera.
Verificación de Salud
HAProxy utiliza verificaciones de salud para determinar si un servidor backend está disponible para procesar solicitudes. Esto evita tener que eliminar manualmente un servidor del backend si se vuelve no disponible. La verificación de salud predeterminada consiste en intentar establecer una conexión TCP con el servidor.
Si un servidor falla en una comprobación de salud y, por lo tanto, no puede atender solicitudes, se deshabilita automáticamente en el backend, y el tráfico no se enviará a él hasta que vuelva a estar saludable. Si todos los servidores en un backend fallan, el servicio se volverá no disponible hasta que al menos uno de esos servidores backend vuelva a estar saludable.
Para ciertos tipos de backends, como servidores de bases de datos, la comprobación de salud predeterminada no necesariamente determina si un servidor sigue siendo saludable.
El servidor web Nginx también se puede usar como un servidor proxy independiente o un balanceador de carga, y a menudo se utiliza en conjunto con HAProxy por sus capacidades de almacenamiento en caché y compresión.
Alta disponibilidad
Las configuraciones de balanceo de carga de capa 4 y 7 descritas en este tutorial utilizan un balanceador de carga para dirigir el tráfico a uno de muchos servidores backend. Sin embargo, su balanceador de carga es un único punto de fallo en estas configuraciones; si falla o se ve abrumado con solicitudes, puede causar una alta latencia o tiempo de inactividad para su servicio.
A high availability (HA) setup is broadly defined as infrastructure without a single point of failure. It prevents a single server failure from being a downtime event by adding redundancy to every layer of your architecture. A load balancer facilitates redundancy for the backend layer (web/app servers), but for a true high availability setup, you need to have redundant load balancers as well.
Aquí hay un diagrama de una configuración de alta disponibilidad:
En este ejemplo, tienes múltiples balanceadores de carga (uno activo y uno o más pasivos) detrás de una dirección IP estática que puede ser remapeada de un servidor a otro. Cuando un usuario accede a tu sitio web, la solicitud pasa a través de la dirección IP externa hacia el balanceador de carga activo. Si ese balanceador de carga falla, tu mecanismo de conmutación por error lo detectará y automáticamente reasignará la dirección IP a uno de los servidores pasivos. Hay varias formas de implementar una configuración de alta disponibilidad activo/pasivo. Para obtener más información, lee Cómo Usar IPs Reservadas.
Conclusión
Ahora que tienes comprensión sobre el balanceo de carga, y sabes cómo hacer uso de HAProxy, tienes una base sólida para empezar a mejorar el rendimiento y la fiabilidad de tu propio entorno de servidor.
Si estás interesado en almacenar la salida de HAProxy para verla más tarde, echa un vistazo a Cómo Configurar el Registro de HAProxy con Rsyslog en CentOS 8 [Inicio Rápido].
Si estás buscando resolver un problema, echa un vistazo a Errores Comunes de HAProxy. Si se necesita un análisis más detallado, consulta Cómo Solucionar Problemas Comunes de HAProxy.