Como Configurar o HAProxy como Balanceador de Carga para o Nginx no CentOS 8

Para garantir a máxima disponibilidade, escalabilidade e alto desempenho de aplicativos web, é comum implementar tecnologias que introduzem redundância, como clustering de servidores e balanceamento de carga. Por exemplo, configurar um cluster de servidores que executam todos os mesmos aplicativos e, em seguida, implantar balanceador(es) de carga na frente deles para distribuir o tráfego.

HAProxy é um balanceador de carga, servidor proxy e terminador SSL/TLS aberto, poderoso, de alto desempenho, confiável, seguro e amplamente utilizado para sites de tráfego muito alto. Ele funciona de forma confiável em Linux, Solaris, FreeBSD, OpenBSD bem como sistemas operacionais AIX.

Este guia mostra como configurar um balanceador de carga dedicado de alta disponibilidade com HAProxy em CentOS 8 para controlar o tráfego em um cluster de NGINX servidores web. Também demonstra como configurar a terminação SSL/TLS em HAProxy.

Pré-requisitos:

A total of 4 servers with minimal CentOS 8 installation.

Configuração do Ambiente de Teste

----------- HAProxy Server Setup ----------- 
HA Proxy Server - hostname: haproxy-server.tecmint.lan; IP: 10.42.0.247
Test Site Domain: www.tecmint.lan


----------- Client Web Servers Setup ----------- 
Web Server #1 - hostname: websrv1.tecmint.lan; IP: 10.42.0.200
Web Server #2 - hostname: websrv2.tecmint.lan; IP: 10.42.0.21
Web Server #3 - hostname: websrv3.tecmint.lan; IP: 10.42.0.34

Passo 1: Configurar o Servidor HTTP Nginx nas Máquinas Cliente

1. Faça login em todas as suas máquinas cliente CentOS 8 e instale o servidor Nginx web usando o gerenciador de pacotes dnf como mostrado.

# dnf install Nginx

2. Em seguida, inicie o serviço Nginx, ative-o para iniciar automaticamente na inicialização do sistema e confirme que está em execução verificando seu status, usando os comandos systemctl (faça isso em todas as máquinas clientes).

# systemctl start nginx
# systemctl enable nginx
# systemctl status nginx

3. Além disso, se o serviço firewalld estiver em execução em todas as máquinas clientes (o que você pode verificar executando systemctl start firewalld), você deve adicionar os serviços HTTP e HTTPS na configuração do firewall para permitir que solicitações do balanceador de carga passem pelo firewall para os servidores web Nginx. Em seguida, recarregue o serviço firewalld para efetuar as novas alterações (faça isso em todas as máquinas clientes).

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent --add-service=https
# firewall-cmd --reload

4. Em seguida, abra um navegador da web em suas máquinas locais e teste se a instalação do Nginx está funcionando corretamente. Use os IPs dos clientes para navegar, uma vez que você veja a página de teste do Nginx, significa que o servidor web instalado na máquina cliente está funcionando corretamente.

Test Nginx Installation on All CentOS 8 Client Machines

5. Em seguida, precisamos criar páginas de teste nas máquinas clientes que usaremos posteriormente para testar a configuração do HAProxy.

----------- Web Server #1 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv1.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #2 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv2.tecmint.lan"> /usr/share/nginx/html/index.html

----------- Web Server #3 ----------- 
# cp /usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.orig
# echo "Showing site from websrv3.tecmint.lan"> /usr/share/nginx/html/index.html

Passo 2: Instalando e Configurando o Servidor HAProxy no CentOS 8

6. Agora instale o pacote HAProxy no servidor HAProxy executando o seguinte comando.

# dnf install haproxy

7. Em seguida, inicie o serviço HAProxy, ative a inicialização automática durante a inicialização do sistema e verifique seu status.

# systemctl start haproxy
# systemctl enable haproxy
# systemctl status haproxy
Verify HAProxy Status in CentOS 8

8. Agora vamos configurar o HAProxy usando o seguinte arquivo de configuração.

# vi /etc/haproxy/haproxy.cfg

O arquivo de configuração é dividido em quatro seções principais.

  • configurações globais – define parâmetros em toda a aplicação.
  • padrões – esta seção define parâmetros padrão para todas as outras seções após sua declaração.
  • frontend – esta seção descreve um conjunto de sockets de escuta que aceitam conexões de clientes.
  • Backend – esta seção descreve um conjunto de servidores aos quais o proxy se conectará para encaminhar conexões de entrada.

Para entender as opções em configurações globais e padrões, leia a documentação do HAProxy (link fornecido no final do artigo). Para este guia, usaremos os padrões.

Configurando o Log do HAProxy

9. O HAProxy, uma vez implantado, desempenhará um papel significativo em sua infraestrutura de TI, portanto, configurar o log para ele é um requisito básico; isso permite obter informações sobre cada conexão com seus servidores web de backend.

O parâmetro de registro (destacado na captura de tela a seguir) declara um servidor Syslog global (como o rsyslog padrão no CentOS) que receberá mensagens de log. Mais de um servidor pode ser declarado aqui.

A configuração padrão aponta para o localhost (127.0.0.1) e local2 é o código de facilidade padrão usado para identificar mensagens de log do HAProxy no rsyslog.

HAProxy Default Log Parameter

10. Em seguida, é necessário informar ao servidor rsyslog como receber e processar mensagens de log do HAProxy. Abra o arquivo de configuração do rsyslog em /etc/rsyslog.conf ou crie um novo arquivo dentro do diretório /etc/rsyslog.d, por exemplo /etc/rsyslog.d/haproxy.conf.

# vi /etc/rsyslog.d/haproxy.conf

Copie e cole a seguinte configuração para coletar log com UDP na porta padrão 514.

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Também adicione estas linhas para instruir o rsyslog a escrever em dois arquivos de log separados com base na gravidade, onde local2 é o código de facilidade definido na configuração do HAProxy acima.

local2.* 	/var/log/haproxy-traffic.log 
local2.notice 	/var/log/haproxy-admin.log

11. Salve o arquivo e feche-o. Em seguida, reinicie o serviço rsyslog para aplicar as alterações recentes.

# systemctl restart rsyslog

Configurando Frentes e Versos do HAProxy

12. Nesta seção, vamos demonstrar como configurar os proxies de front-end e back-end. Volte para o arquivo de configuração do HAProxy e modifique as seções padrão de front-end e back-end da seguinte forma. Não entraremos em uma explicação detalhada de cada parâmetro, você sempre pode consultar a documentação oficial.

A configuração a seguir define uma seção listen usada para servir a página HAProxy Stats. O parâmetro bind atribui um ouvinte a um determinado endereço IP (* para todos neste caso) e porta (9000).

A configuração de stats enable habilita a página de estatísticas que será acessada usando o URI /stats (ou seja, http://server_ip:9000/stats).

A configuração de stats auth é usada para adicionar uma autenticação básica ao acessar a página (substitua haproxy e Lostp@1ss por um nome de usuário e senha de sua escolha).

listen stats
    bind *:9000
    stats enable
    stats hide-version
    stats uri /stats
    stats admin if LOCALHOST
    stats auth haproxy:Lostp@1ss

13. A próxima configuração define uma seção de front-end chamada TL (você pode dar um nome de sua preferência). O parâmetro mode define o modo de operação do HAProxy.

O parâmetro acl (Access Control List) é usado para tomar uma decisão com base no conteúdo extraído da solicitação. Neste exemplo, a solicitação é considerada simples HTTP se não for feita sobre SSL.

Então, a configuração http-request set-header é usada para adicionar um cabeçalho HTTP à solicitação. Isso ajuda a informar ao Nginx que a solicitação inicial foi feita sobre HTTP (ou via porta 80).

A diretiva default_backend ou use_backend define os servidores de backend, neste caso, referenciados por TL_web_servers.

Observe que o HAProxy retornará um erro “503 Service Unavailable” se uma solicitação não for roteada por uma diretiva use_backend ou default_backend.

frontend TL
    bind *:80
    mode http
    acl http  ssl_fc,not
    http-request set-header X-Forwarded-Protocol http if http
    default_backend TL_web_servers

14. Então precisamos definir uma seção de backend onde a configuração balance define como o HAProxy seleciona os servidores de backend para processar uma solicitação se nenhum método de persistência substituir essa seleção.

A diretiva cookie permite a persistência baseada em cookie, instrui o HAProxy a enviar um cookie chamado SERVERID para o cliente e associá-lo ao ID do servidor que deu a resposta inicial.

A diretiva server é usada para definir os servidores upstream no formato nome_do_servidor (por exemplo websrv1), IP_do_servidor:porta e opções.

Uma opção chave é check que diz ao HAProxy para continuar verificando a disponibilidade de um servidor e relatar na página de estatísticas.

backend TL_web_servers
    mode http
    balance roundrobin
    option  httpchk HEAD /
    cookie SERVERUID insert indirect nocache
    server  websrv1 10.42.0.200:80 cookie websrv1 check
    server  websrv2 10.42.0.21:80  cookie websrv2 check
    server  websrv3 10.42.0.34:80  cookie websrv3 check

Comente quaisquer outras seções de frontend e backend conforme mostrado na captura de tela que segue. Salve o arquivo e feche-o.

Configuring HAProxy Front-end and Back-ends

15. Agora reinicie o serviço HAProxy para aplicar as novas alterações.

# systemctl restart haproxy

16. Em seguida, certifique-se de que os serviços HTTP (porta 80) e HTTPS (porta 433) estejam abertos no firewall para aceitar solicitações de clientes da seguinte forma. Além disso, abra a porta 9000 no firewall para acessar a página de estatísticas e recarregue as configurações do firewall.

# firewall-cmd --zone=public --permanent --add-service=http
# firewall-cmd --zone=public --permanent –add-service=https
# firewall-cmd --zone=public --permanent --add-port=9000/tcp
# firewall-cmd --reload

Passo 3: Testando a Configuração do HAProxy e Visualizando Estatísticas

17. Agora é hora de testar a configuração do HAPrxoy. Na máquina desktop local de onde você está acessando todos os servidores, adicione a seguinte linha no arquivo /etc/hosts para nos permitir usar o domínio do site fictício.

10.42.0.247  www.tecmint.lan

18. Em seguida, abra um navegador e navegue usando o endereço do servidor ou domínio do site.

http://10.42.0.247/
OR
http://www.tecmint.lan/
Check HAProxy Setup

19. Para acessar a página de estatísticas do HAProxy, use o seguinte endereço.

http://10.42.0.247:9000/stats

Em seguida, use o nome de usuário e senha que você definiu no arquivo de configuração do HAProxy (consulte o parâmetro stats auth).

HAProxy Stats Login Page

Após um login bem-sucedido, você será direcionado para a página de estatísticas do HAProxy que mostra métricas que abrangem a saúde de seus servidores, taxas de solicitação atuais, tempos de resposta e muito mais.

Para demonstrar como o relatório de status funciona em relação ao trabalho dos códigos de cores, colocamos um dos servidores back-end.

HAProxy Statistics Report

Passo 4: Configurando HTTPS no HAProxy Usando um Certificado SSL Autoassinado

20. Nesta seção final, demonstraremos como configurar SSL/TLS para proteger todas as comunicações entre o servidor HAProxy e o cliente. O HAProxy suporta quatro modos principais de configuração de HTTPS, mas para este guia, usaremos a descarga de SSL/TLS.

No modo de descarga de SSL/TLS, o HAProxy decifra o tráfego no lado do cliente e se conecta em tráfego claro aos servidores back-end.

Começaremos criando o certificado e a chave conforme mostrado (responda às perguntas de acordo com os detalhes da sua empresa durante a criação do certificado, conforme destacado na captura de tela).

# mkdir /etc/ssl/tecmint.lan
# cd /etc/ssl/tecmint.lan/
# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/tecmint.lan.key -out /etc/ssl/tecmint.lan.crt
# cd /etc/ssl/tecmint.lan/
# cat tecmint.crt tecmint.key >tecmint.pem
# ls -l
Create SSL for HAProxy

21. Em seguida, abra o arquivo de configuração do HAProxy (/etc/haproxy/haproxy.cfg) e edite a seção de front-end.

frontend TL
    bind *:80
    bind *:443 ssl crt /etc/ssl/tecmint.lan/tecmint.pem
    redirect  scheme  https  if  !{ ssl_fc }
    mode http
    acl http  ssl_fc,not
    acl https ssl_fc
    http-request set-header X-Forwarded-Protocol http if http
    http-request set-header X-Forwarded-Protocol https if https
    default_backend TL_web_servers
Configure HAProxy Front-end with SSL

Salve o arquivo e feche-o.

22. Em seguida, reinicie o serviço do HAProxy para aplicar as novas alterações.

# systemctl restart haproxy.service

23. Em seguida, abra um navegador da web e tente acessar o site novamente. O navegador mostrará um erro devido ao certificado autoassinado, clique em Avançado para prosseguir.

HAProxy SSL Connection Error
Proceed with Connection
Access Site Over HTTPS

Isso é tudo por agora! Cada aplicativo web tem seu próprio conjunto de requisitos, você precisa projetar e configurar o balanceamento de carga para atender à sua infraestrutura de TI e aos requisitos do aplicativo.

Para obter mais insights sobre algumas das opções de configuração usadas neste guia e, em geral, como usar o HAProxy, consulte a documentação oficial da edição comunitária do HAProxy ou a documentação da versão empresarial do HAProxy. Você pode enviar quaisquer perguntas ou ideias através do formulário de feedback abaixo.

Source:
https://www.tecmint.com/setup-nginx-haproxy-load-balancer-in-centos-8/