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.