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

Para garantir a máxima disponibilidade, escalabilidade e alto desempenho de aplicações web, é comum implementar tecnologias que introduzem redundância, como agrupamento de servidores e balanceamento de carga. Por exemplo, configurar um cluster de servidores que executam as mesmas aplicações e, em seguida, implantar balanceadores de carga à frente deles para distribuir o tráfego.

HAProxy é um balanceador de carga TCP/HTTP de alta disponibilidade, open-source, poderoso, de alto desempenho, confiável, seguro e amplamente utilizado, servidor proxy e terminador SSL/TLS projetado para sites de tráfego muito alto. Ele funciona de maneira confiável em sistemas operacionais Linux, Solaris, FreeBSD, OpenBSD e também AIX.

Este guia mostra como configurar um balanceador de carga de alta disponibilidade dedicado com HAProxy no CentOS 8 para controlar o tráfego em um cluster de servidores web NGINX. Também demonstra como configurar a terminação SSL/TLS no 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: Configurando 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 web Nginx usando o gerenciador de pacotes dnf conforme mostrado.

# dnf install Nginx

2. Em seguida, inicie o serviço Nginx, por enquanto, habilite-o para iniciar automaticamente na inicialização do sistema e confirme que está ativo e funcionando, 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 as solicitações do balanceador de carga passem pelo firewall até os servidores web Nginx. Em seguida, recarregue o serviço firewalld para efetivar 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 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 adequadamente.

Test Nginx Installation on All CentOS 8 Client Machines

5. Em seguida, precisamos criar páginas de teste nas máquinas clientes que usaremos mais tarde 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, habilite-o para iniciar automaticamente na 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 para todo o processo.
  • 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 soquetes 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 recebidas.

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 Registro do HAProxy

9. Uma vez implantado, o HAProxy desempenhará um papel significativo na sua infraestrutura de TI, portanto, configurar o registro para ele é uma exigência básica; isso permite obter insights sobre cada conexão com seus servidores web de backend.

O parâmetro de log (destacado na captura de tela a seguir) declara um servidor global Syslog (como o rsyslog, padrão no CentOS) que receberá as 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 sob rsyslog.

HAProxy Default Log Parameter

10. Em seguida, você precisa informar ao servidor rsyslog como receber e processar as 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 

Adicione também 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 Front-ends e Back-ends do HAProxy

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

A configuração a seguir define uma seção listen usada para servir a página de estatísticas do 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 enable das estatísticas ativa a página de estatísticas que será acessada usando o URI /stats (ou seja, http://server_ip:9000/stats).

A configuração de auth das estatísticas é 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 frontend 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 (Lista de Controle de Acesso) é usado para tomar uma decisão com base no conteúdo extraído da solicitação. Neste exemplo, a solicitação é considerada HTTP simples 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 o Nginx de que a solicitação inicial foi feita sobre HTTP (ou através da porta 80).

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

Note que o HAProxy retornará um erro de “503 Serviço Indisponível” 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 back-end para processar uma solicitação se nenhum método de persistência substituir essa seleção.

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

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

Uma opção importante é check, que indica 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 a seguir. 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

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

17. Agora é hora de testar a configuração do HAProxy. 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

Então use o nome de usuário e senha que você definiu no arquivo de configuração do HAProxy (consulte o parâmetro de autenticação de estatísticas).

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, nós colocamos um dos servidores de 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 HTTPS, mas para este guia, utilizaremos a offloading de SSL/TLS.

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

Começaremos criando o certificado e a chave conforme mostrado (responda às perguntas de acordo com os detalhes de 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 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. Depois, 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

Por enquanto é só! Cada aplicação web tem seu próprio conjunto de requisitos, você precisa projetar e configurar o balanceamento de carga para atender à infraestrutura de TI e aos requisitos da aplicação.

Para obter mais informações sobre algumas das opções de configuração usadas neste guia, e em geral como usar 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 postar quaisquer perguntas ou pensamentos através do formulário de feedback abaixo.

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