Pesquisa de site

Como configurar o HAProxy como balanceador de carga para Nginx no CentOS 8


Para garantir a máxima disponibilidade, escalabilidade e alto desempenho das aplicações web, agora é comum implementar tecnologias que introduzam redundância, como clustering de servidores e balanceamento de carga. Por exemplo, configurar um cluster de servidores que executem os mesmos aplicativos e, em seguida, implantar balanceadores de carga na frente deles para distribuir o tráfego.

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

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

Pré-requisitos:

Um total de 4 servidores com instalação mínima do CentOS 8.

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

Etapa 1: Configurando o servidor HTTP Nginx nas máquinas clientes

1. Faça login em todas as suas máquinas clientes 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 se ele está instalado e funcionando verificando seu status, usando o systemctl comandos (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 sendo executado em todas as máquinas clientes (o que você pode verificar executando systemctl start firewalld), você deverá adicionar o HTTP e o Serviços 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 bem. Use os IPs do cliente para navegar, ao ver a página de teste do Nginx significa que o servidor web instalado na máquina cliente está funcionando corretamente.

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

Etapa 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 inicialização automática na inicialização do sistema e verifique seu status.

systemctl start haproxy
systemctl enable haproxy
systemctl status haproxy

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

vi /etc/haproxy/haproxy.cfg

O arquivo de configuração está 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 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 registro HAProxy

9. HAProxy quando implantado, desempenhará um papel significativo em sua infraestrutura de TI, portanto, configurar o registro para ele é um requisito básico; isso permite que você obtenha insights sobre cada conexão com seus servidores web back-end.

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

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

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

vi /etc/rsyslog.d/haproxy.conf

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

$ModLoad imudp 
$UDPServerAddress 127.0.0.1 
$UDPServerRun 514 

Adicione também essas linhas para instruir o rsyslog a gravar em dois arquivos de log separados com base na gravidade, onde local2 é o código do recurso 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-end e back-end do HAProxy

12. Nesta seção, demonstraremos como configurar os proxies front-end e back-end. Volte para o arquivo de configuração HAProxy e modifique as seções padrão de front-end e back-end como segue. 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 stats enable ativa a página de estatísticas que será acessada usando o URI /stats (ou seja, http://server_ip:9000/stats) .

A configuração 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 do seu 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 em que o HAProxy opera.

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 por SSL.

Em seguida, 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 por HTTP (ou pela porta 80).

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

Observe que HAProxy retornará um “503 erro de serviço indisponível ” se uma solicitação não for roteada por um use_backend ou default_backend > diretiva.

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. Em seguida, precisamos definir uma seção de back-end onde a configuração balance define como o HAProxy seleciona os servidores back-end para processar uma solicitação se não O método de persistência substitui essa seleção.

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

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

Uma opção importante é check, que diz ao HAProxy para continuar verificando a disponibilidade de um servidor e reportar 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 front-end e back-end, conforme mostrado na captura de tela a seguir. Salve o arquivo e feche-o.

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

systemctl restart haproxy

16. Em seguida, certifique-se de que HTTP (porta 80) e HTTPS (porta 433) são abertos no firewall para aceitar solicitações de clientes da seguinte maneira. 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: testar a configuração do HAProxy e visualizar 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 o domínio do site.

http://10.42.0.247/
OR
http://www.tecmint.lan/

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 a senha que você definiu no arquivo de configuração do HAProxy (consulte o parâmetro stats auth).

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

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

Etapa 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 e o cliente HAProxy. O HAProxy oferece suporte a quatro modos de configuração HTTPS principais, mas para este guia usaremos o descarregamento SSL/TLS.

No modo de descarregamento 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 adequadamente com base nos 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

21. Em seguida, abra o arquivo de configuração 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

Salve o arquivo e feche-o.

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

systemctl restart haproxy.service

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

É tudo por agora! Cada aplicativo da 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 informações sobre algumas das opções de configuração usadas neste guia e, em geral, sobre como usar o HAProxy, consulte a documentação oficial da edição da comunidade do HAProxy ou a documentação da versão corporativa do HAProxy. Você pode postar qualquer dúvida ou opinião por meio do formulário de feedback abaixo.