HAProxy o High Availability Proxy es un software de servidor proxy y equilibrador de carga TCP y HTTP de código abierto. HAProxy ha sido escrito por Willy Tarreau en C, es compatible con SSL, compresiones, keep-alive, formatos de registro personalizados y reescritura de encabezados. HAProxy es un servidor proxy y un equilibrador de carga rápidos y livianos con una pequeña huella de memoria y bajo uso de CPU. Es utilizado por sitios grandes como Github, StackOverflow, Reddit, Tumblr, Twitter y otros. Se ha convertido en el equilibrador de carga de software y servidor proxy más popular en los últimos años.
En este tutorial, obtendrá la instalación y configuración de HAProxy en RHEL 8 / CentOS 8. Instalaremos HAProxy en un solo servidor y luego instalaremos el servidor web Nginx en los otros servidores. HAProxy actuará como un equilibrador de carga para los servidores web Nginx.
Arquitectura HAProxy.
Requisitos de software y convenciones de la línea de comandos de Linux Categoría | Requisitos, convenciones o versión de software utilizada |
Sistema | RHEL 8 / CentOS 8 |
Software | HAProxy, Nginx |
Otro | Acceso privilegiado a su sistema Linux como root o a través de sudo comando. |
Convenciones | # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando $ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios |
Arquitectura y conceptos HAProxy
HAProxy puede ejecutarse en dos modos:modo TCP de capa 4 y modo HTTP de capa 7. En el modo TCP de capa 4, HAProxy reenvía los paquetes RAW TCP del cliente a los servidores de aplicaciones. En el modo HTTP de capa 7, HAProxy analiza el encabezado HTTP antes de reenviarlo a los servidores de aplicaciones. En este tutorial, usaremos Nginx como el servidor web que admite el modo HTTP de capa 7.
Equilibrio de carga de capa 4. Equilibrio de carga de capa 7.
Balance Algorithm es el algoritmo que utiliza HAProxy para seleccionar el servidor al realizar el equilibrio de carga. Están disponibles los siguientes modos:
Roundrobin
Este es el algoritmo de equilibrio más simple. Para cada nueva conexión, será manejada por el siguiente servidor backend. Si se llega al último servidor backend de la lista, comenzará de nuevo desde la parte superior de la lista backend.
Leastconn
La nueva conexión será manejada por el servidor backend con la menor cantidad de conexiones. Esto es útil cuando el tiempo y la carga de las solicitudes varían mucho.
Fuente
Esto es para sesiones pegajosas, la IP del cliente será codificada para determinar el servidor back-end que recibió la última solicitud de esta IP. Entonces, una IP A siempre será manejada por backend1, y la IP B siempre será manejada por banckend2 para no interrumpir las sesiones.
Configurar archivo de hosts para resolución de nombres
Inicie sesión en el servidor del equilibrador de carga y edite el /etc/hosts
archivo y balanceador de carga HAProxy, nginx1, nginx2 nombres de host. Copie el mismo archivo en otros dos nodos nginx y verifique la conectividad de la red mediante el comando ping.
# vim /etc/hosts
192.168.1.108 loadbalancer.example.com
192.168.1.104 nginx1.example.com
192.168.1.105 nginx2.example.com
Instalar y configurar HAProxy
HAProxy está disponible en el repositorio RHEL 8/CentOS 8, por lo tanto, inicie sesión en el servidor del equilibrador de carga e instale el paquete HAProxy con este comando yum.
# yum install haproxy
Una vez instalado correctamente, puede usar el siguiente comando para verificar la instalación.
# yum info haproxy
# yum info haproxy
Updating Subscription Management repositories.
Updating Subscription Management repositories.
Last metadata expiration check: 0:06:03 ago on Sat 16 Mar 2019 11:40:24 PM +04.
Installed Packages
Name : haproxy
Version : 1.8.14
Release : 1.el8
Arch : x86_64
Size : 4.1 M
Source : haproxy-1.8.14-1.el8.src.rpm
Repo : @System
From repo : rhel-8-for-x86_64-appstream-beta-rpms
Summary : HAProxy reverse proxy for high availability environments
URL : http://www.haproxy.org/
License : GPLv2+
Description : HAProxy is a TCP/HTTP reverse proxy which is particularly suited for high
: availability environments. Indeed, it can:
: - route HTTP requests depending on statically assigned cookies
: - spread load among several servers while assuring server persistence
: through the use of HTTP cookies
: - switch to backup servers in the event a main one fails
: - accept connections to special ports dedicated to service monitoring
: - stop accepting connections without breaking existing ones
: - add, modify, and delete HTTP headers in both directions
: - block requests matching particular patterns
: - report detailed status to authenticated users from a URI
: intercepted from the application
Cuando finalice la instalación, vaya a /etc/haproxy/
directorio y haga una copia de seguridad del archivo de configuración original.
# cd /etc/haproxy/
# cp haproxy.cfg haproxy.cfg.orig
A continuación, realice los siguientes cambios en el archivo de configuración de HAProxy haproxy.cfg
con cualquiera de los editores.
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
#
# https://www.haproxy.org/download/1.8/doc/configuration.txt
#
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# HAProxy Monitoring Config
#---------------------------------------------------------------------
listen stats
bind loadbalancer.example.com:8080 # HAProxy Monitoring run on port 8080
mode http
option forwardfor
option httpclose
stats enable
stats show-legends
stats refresh 5s
stats uri /stats # URL for HAProxy monitoring
stats realm Haproxy\ Statistics
stats auth admin:admin # User and Password for login to the monitoring dashboard
#stats admin if TRUE
default_backend loadbalancer # This is optionally for monitoring backend
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend loadbalancer
bind loadbalancer.example.com:80
#acl url_static path_beg -i /static /images /javascript /stylesheets
#acl url_static path_end -i .jpg .gif .png .css .js
#use_backend static if url_static
option http-server-close
option forwardfor
default_backend loadbalancer
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
#backend static
# balance roundrobin
# server static 127.0.0.1:4331 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend loadbalancer
balance roundrobin # Balance algorithm
option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost # Check the server application is up and healty - 200 status code
server nginx1.example.com 192.168.1.104:80 check # NGINX Server1
server nginx2.example.com 192.168.1.105:80 check # NGNIX Server2
Guarde este archivo de configuración y salga.
Ahora, configuraremos el demonio rsyslog para registrar las estadísticas de HAProxy. Edite el rsyslog.conf
para permitir que rsyslog utilice el puerto UDP 514. Abra el archivo de configuración rsyslog y descomente las líneas para habilitar la conexión UDP.
# vim /etc/rsyslog.conf
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
Guarde el archivo con los cambios anteriores y salga. Luego cree un nuevo archivo de configuración HAProxy para rsyslog y agregue las siguientes entradas en ese archivo.
# cd /etc/rsyslog.d/
# vi haproxy.conf
local2.=info /var/log/haproxy-access.log # For Access Log
local2.notice /var/log/haproxy-info.log # For Service Info - Backend, loadbalancer
Ahora reinicie rsyslog y luego inicie el servicio HAProxy y agregue HAProxy para comenzar en el momento del arranque.
# systemctl restart rsyslog
# systemctl start haproxy
# systemctl enable haproxy
Instalar y configurar Nginx
Nginx ya es parte del repositorio RHEL 8/CentOS 8 existente y se puede instalar con el siguiente comando.
# yum install nginx
Una vez instalado, puede verificar la instalación con la ayuda de este comando.
# yum info nginx
# yum info nginx
Updating Subscription Management repositories.
Updating Subscription Management repositories.
Last metadata expiration check: 0:06:14 ago on Sat 16 Mar 2019 11:40:24 PM +04.
Installed Packages
Name : nginx
Epoch : 1
Version : 1.14.0
Release : 3.el8+1631+ba902cf0
Arch : x86_64
Size : 568 k
Source : nginx-1.14.0-3.el8+1631+ba902cf0.src.rpm
Repo : rhel-8-for-x86_64-appstream-beta-rpms
Summary : A high performance web server and reverse proxy server
URL : http://nginx.org/
License : BSD
Description : Nginx is a web server and a reverse proxy server for HTTP, SMTP, POP3 and
: IMAP protocols, with a strong focus on high concurrency, performance and low
: memory usage.
Una vez que Nginx esté instalado, vaya al directorio web y cambie el index.html
archivo en consecuencia. Asegúrese de seguir los pasos a continuación en el servidor nginx1 y nginx2.
# cd /usr/share/nginx/html
# ls -lrth
total 20K
-rw-r--r--. 1 root root 2.8K Oct 31 2016 poweredby.png
-rw-r--r--. 1 root root 368 Oct 31 2016 nginx-logo.png
-rw-r--r--. 1 root root 3.7K Mar 16 20:39 50x.html
-rw-r--r--. 1 root root 3.6K Mar 16 20:39 404.html
-rw-r--r--. 1 root root 3.7K Mar 16 20:42 index.html
A continuación, agregue Nginx para iniciar en el momento del arranque y luego inicie el demonio con los siguientes comandos.
# systemctl enable nginx
# systemctl start nginx
Prueba de la función Equilibrio de carga
Las pruebas se pueden realizar navegando y accediendo a la IP del balanceador de carga 192.168.1.108 (en mi caso) y verá que una vez va al Nginx Node1 y la segunda vez va al Nginx Node2 de forma rotativa.
Página web sobre NGINX Node1. Página web sobre NGINX Node2.
También puede consultar el /var/log/haproxy-access.log
para obtener información detallada sobre el equilibrio de carga.
Acceda a la URL de estadísticas de HAProxy
Acceda al panel del Informe estadístico de HAProxy que se ejecuta en el puerto 8080 con el nombre de usuario y la contraseña definidos en haproxy.cfg
archivo.
http://192.168.1.108:8080/stats
Acceda a la URL de estadísticas de HAProxy. Tablero de estadísticas de HAProxy.
HAProxy funciona correctamente y actúa como equilibrador de carga para los dos servidores web Nginx.
Conclusión
HAProxy o proxy de alta disponibilidad es un software de código abierto que proporciona alta disponibilidad para servicios basados en TCP, funciona como equilibrador de carga HTTP y servidor proxy. El software está escrito en C y soporta SSL, keep-alive y compresión. HAProxy es la opción correcta para todos los que necesitan un balanceador de carga y un servidor proxy que sea rápido y liviano con una pequeña huella de memoria y bajo uso de CPU. Haproxy puede ejecutarse en modo TCP de capa 4 y en modo HTTP de capa 7. Nginx solo admite el modo HTTP de capa 7 con HAProxy. Si desea utilizar el modo TCP de capa 4, puede utilizar otros servidores web como Apache. En RHEL 8/CentOS 8 Linux, HAProxy está disponible en el repositorio predeterminado. Es fácil de instalar y configurar.