Tabla de contenido
Olá de novo! Hoje vamos falar de encaminhamento e equilíbrio HTTP básico com HAProxy.
O que é HAProxy?
HAProxy é um software que nos permite executar o balanceamento de carga sobre HTTP ou TCP (não permite o balanceamento UDP).
Características
- Permite SSL configurado em HAProxy e/ou no backend
- Suporte IPv6
- Admite ACL
- Possibilita VirtualHosts
- Pode configurar Healthchecks ou verificações de estado dos backends.
- Permite o HTTP Keep-Alive
Principais modos de trabalho
Tem duas formas de trabalhar:
- Modo TCP: Pode equilibrar entre múltiplos servidores SSH, MySQL, SMTP, etc.
- Modo HTTP: Utilizando normas HTTP e HTTPS, pode efectuar o equilíbrio entre vários servidores web e modificar os cabeçalhos de ligação.
Formas de equilibrar
Pode equilibrar-se com base nas seguintes políticas:
- Roundrobin: equilíbrio entre os diferentes servidores backend.
- Leastconn: Equilíbrio tendo em conta que o número de ligações redireccionadas é feito de uma forma equilibrada entre os backends. Recomendado para ligações longas
- Source: O pedido pode ser equilibrado para que, dependendo do PI do pedido, os seguintes pedidos vão sempre para o mesmo backend.
Sticky sessions
Algumas aplicações podem exigir que o utilizador se ligue ao mesmo servidor back end. Isto é conseguido através de Sessões Pegajosas utilizando o parâmetro de aplicação no backend que o requer.
Exemplo de equilíbrio por defeito
Por defeito, o rolo será roundrobin.
root@haproxy:~# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners stats timeout 30s user haproxy group haproxy daemon # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets 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 frontend web1 bind *:80 mode http use_backend web1 default_backend web1 backend web1 mode http server s1 172.17.0.3:80 server s2 172.17.0.4:80 root@haproxy:~#
En el ejemplo se balancea el puerto 80 de todas las IPs de la maquina y se destinan al backend web1 que está compuesto por los servidores s1 (172.17.0.3) y s2 (172.17.0.4). Para verlo mejor en lo ejemplos que hagamos, el s1 es es Nginx y el s2 es Apache:
[ger-pc ~]# curl -s 172.17.0.3|grep nginx -i|head -n 1 <title>Welcome to nginx!</title> [ger-pc ~]# curl -s 172.17.0.4|egrep "apache|nginx" -i|head -n 1 <address>Apache/2.4.52 (Debian) Server at 172.17.0.4 Port 80</address> [ger-pc ~]#
O servidor haproxy é configurado no IP 172.17.0.2. Se lhe forem feitos pedidos, ele equilibra entre os 2 backends:
[ger-pc ~]# curl -s 172.17.0.2|egrep "apache|nginx" -i|head -n 1 <title>Welcome to nginx!</title> [ger-pc ~]# curl -s 172.17.0.2|egrep "apache|nginx" -i|head -n 1 <address>Apache/2.4.52 (Debian) Server at 172.17.0.2 Port 80</address> [ger-pc ~]# curl -s 172.17.0.2|egrep "apache|nginx" -i|head -n 1 <title>Welcome to nginx!</title> [ger-pc ~]# curl -s 172.17.0.2|egrep "apache|nginx" -i|head -n 1 <address>Apache/2.4.52 (Debian) Server at 172.17.0.2 Port 80</address> [ger-pc ~]#
Exemplo de vários tipos de balanceamento
Para modificar o tipo de equilíbrio, o balanço da declaração é especificado juntamente com o nome do tipo de equilíbrio:
Roundrobin
backend web1 mode http balance roundrobin server s1 172.17.0.3:80 weight 2 server s2 172.17.0.4:80 weight 1
Cada servidor tem um peso definido pela declaração de weight e o número do seu peso. Quanto mais alto for o número de peso, maior é a probabilidade de receber pedidos. No exemplo acima, o servidor s1 receberá mais pedidos.
Source
backend web1 mode http balance source server s1 172.17.0.3:80 server s2 172.17.0.4:80
Leastconn
backend web1 mode http balance leastconn server s1 172.17.0.3:80 server s2 172.17.0.4:80
Healthchecks
Os healthchecks são testes que são realizados para verificar o estado dos servidores backend para saber se estão disponíveis e assim redireccionar os pedidos apenas para aqueles que estão em boas condições.
Se um destes servidores for abaixo, com a configuração básica que estabelecemos acima, não fazendo verificações de saúde, os pedidos poderiam ser redireccionados para o backend que está abaixo.
Isto pode ser resolvido adicionando verificações ao back end usando o parâmetro de verificação na declaração do servidor que define o servidor back end:
backend web1 mode http server s1 172.17.0.3:80 check server s2 172.17.0.4:80 check
Healthchecks activos
Os Healthchecks activos são aqueles que são realizados por defeito quando apenas especificamos a palavra verificação, como no exemplo acima. Este tipo de verificações são realizadas periodicamente para os backends.
A estrutura é a seguinte:
server nombre host:puerto check inter tiempo fall numero rise numero
Os parâmetros de verificação padrão são feitos desta forma com o :
backend web1 mode http server s1 172.17.0.3:80 check inter 2s fall 3 rise 2 server s2 172.17.0.4:80 check inter 2s fall 3 rise 2
O significado dos parâmetros de verificação são os seguintes:
- inter: Define o tempo de separação entre as verificações (por defeito 2 segundos).
- fall:Número de verificações a marcar como backend que estava a decorrer
- rise:Número de verificações a marcar como óptimo um backend que estava em baixo.
Pode ver mais sobre healthchecks em https://www.haproxy.com/blog/how-to-enable-health-checks-in-haproxy/