Como balancear minhas aplicações com o HAProxy (CentOS 7)?

Como balancear minhas aplicações com o HAProxy (CentOS 7)?

HAProxy é uma ferramenta desenvolvida para melhorar o desempenho de seu cloud server, garantindo a qualidade do serviço e a alta disponibilidade das aplicações. Para isso, o HAProxy distribui as requisições dos usuários em múltiplos servidores denominados backends.

O HAProxy roda no sistema operacional Linux, mas é possível utilizá-lo para balancear aplicações web que rodam em ambiente Windows. Para isso, basta criar um novo servidor com o template HAProxy e configurar como backendsos servidores de aplicações.

Instalação

A CentralServer disponibiliza um template do HAProxy no Painel do CloudFlex. Para realizar a instalação, siga os passos abaixo:

1. Acesse o Painel do CloudFlex através do endereço http://console.cloudflex.com.br/;


2. Em "Status dos Cloud Servers", clique sobre o ícone correspondente ao cloud server desejado ou utilize a ferramenta de pesquisa;
Status CF.png


3. Em “Controle do Servidor”, clique em “Instalar” caso ainda não tenha instalado seu CloudFlex. Caso contrário, clique em “Reinstalar”;
Cor22.png
Cor01.png


4. Em caso de instalação, clique em “Sim” na tela seguinte.
Cfproxy02.png


5. Em caso de reinstalação, marque a opção “Confirmo a reinstalação do Cloud Server” e, em seguida, clique em “Confirmar”.
NOTA: Ao reinstalar o cloud server todos os dados do sistema operacional, serviços, aplicações e snapshots serão perdidos.
Cfhaproxy6.png


6. Clique em “Selecione um template”, selecione a opção “HAProxy x.x” e, em seguida, clique em “Confirmar instalação”;
Cfproxy03.png


7. Por fim, clique em “Sim” na tela seguinte;
Cfproxy05.png


8. É possível acompanhar o progresso da instalação através da página inicial do Painel do CloudFlex:
Cfhaproxy04.png


Caso opte por não utilizar o template disponível no Painel do CloudFlex, execute o comando abaixo no terminal de seu cloud server para instalar o HAProxy em um servidor com o CentOS 7:

yum -y install haproxy

Configuração haproxy.cfg

A configuração do servidor HAProxy é feita através do arquivo /etc/haproxy/haproxy.cfg

Este arquivo pode ser dividido nas seguintes partes:

  • Configuração geral
  • Configuração de backends
  • Configuração para balanceamento HTTP
  • Configuração para balanceamento HTTPS

Configuração geral

As configurações a seguir devem ser utilizadas em todos os balanceadores. Com estas configurações será criado um balanceador otimizado para praticamente qualquer tipo de balanceamento:

global
   chroot /var/lib/haproxy
   user haproxy
   group haproxy
   daemon
   user haproxy
   group haproxy
  
 tune.bufsize 16384
 tune.maxrewrite 1024
 spread-checks 4
defaults
   log global
   mode http
   option httplog
   option dontlognull
   option forwardfor
   option http-server-close
   option redispatch
   timeout connect 15s
   timeout client 60s
   timeout server 80s
   timeout http-request 15s
   timeout http-keep-alive 15s

Página de estatísticas

Além da configuração padrão, é possível gerar uma página com estatísticas dos serviços que estão sendo balanceados pelo HAProxy, utilizando as configurações abaixo:

   listen stats :1936
   mode http
   stats enable
   stats uri /
   stats hide-version
   stats auth <LOGIN>:<SENHA>

Esta página de estatísticas ficará disponível no endereço http://<IPServidor>:1936. Caso queria utilizar outra porta para acesso a página de estatísticas, basta alterar para a porta desejada no campo listen stats. Para acesso a esta página, serão necessários os dados de autenticação informados no parâmetro stats auth.

Configuração de backends

Com as configurações abaixo, serão criados os conjuntos de servidores que receberão as requisições balanceadas:

   backend Site01_RealServers
   server ap01 XX.XX.XX.XX:80 check
   server ap02 XX.XX.XX.XX:80 check

NOTA: Alterando o nome do conjunto de backends, é possível criar quantos conjuntos forem necessários.

Configuração para balanceamento HTTP

Com as configurações abaixo, será configurado o balanceamento de conexões HTTP:

   frontend Site01_Entrada_http
   bind *:80
   option httplog
   balance roundrobin
   log-format %ci:%cp\ -\ -\ [%Tl]\ <<%r>>\ %ST\ %B\ XXXX
   default_backend Site01_RealServers

NOTAS:

  • Alterando o nome do frontend, é possível criar outros balanceadores no mesmo servidor.
  • O campo bind pode receber o IP que receberá as conexões a serem balanceadas, caso opte por colocar o caractere “*” (asterisco) o HAProxy irá receber conexões em todos os endereços do servidor.
  • O campo default_backend especifica para qual conjunto de servidores as conexões devem ser direcionadas. No exemplo acima, é utilizada como default_backend a opção balance roundrobin, porém, há também as seguintes opções:
 Roundrobin: Cada servidor é usado em turnos de acordo com seus pesos. Este é o algoritmo mais suave e mais justo quando o tempo de processamento dos servidores continua a ser igualmente distribuído. Este algoritmo é dinâmico, que permite pesos dos servidores a ser ajustado na mosca.
 Leastconn: O servidor com o menor número de conexões é escolhido. Round-robin é realizada entre servidores com a mesma carga. Usando esse algoritmo é recomendada com sessões longas, tais como LDAP, SQL, TSE, etc, mas não é muito bem adaptado para sessões curtas, como HTTP.
 First: O primeiro servidor com ranhuras de ligação disponíveis recebe a ligação. Os servidores são escolhidos entre o menor identificador numérico para o mais alto, cujo padrão é a posição do servidor na fazenda. Uma vez que um servidor atinge seu maxconn valor, o próximo servidor é usado.
 Source: O endereço IP de origem é hash e dividido pelo peso total dos servidores de funcionamento para designar qual servidor irá receber o pedido. Desta forma, o mesmo endereço IP do cliente será sempre chegar ao mesmo servidor enquanto os servidores permanecem as mesmas.

Configuração para balanceamento HTTPS (SSL)

A partir das configurações abaixo, será configurado o balanceamento de conexões HTTPS.

Nesta primeira, parte serão restritos os protocolos e algoritmos de criptografia. Esta restrição é feita para evitar problemas com protocolos e formas de criptografias mais antigas e vulneráveis.

 tune.ssl.default-dh-param 2048
 ssl-default-bind-options no-sslv3 no-tls-tickets
 ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
 ssl-default-server-options no-sslv3 no-tls-tickets
 ssl-default-server-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA

  frontend Site01_Entrada_https
   bind *:443 ssl crt /etc/pki/certificado.pem
   option httplog
   balance source
   hash-type map-based sdbm
   log-format %ci:%cp\ -\ -\ [%Tl]\ <<%r>>\ %ST\ %B\ XXXX\ %sslc\ %sslv
   default_backend Site01_RealServers

NOTAS:

  • Alterando o nome do frontend, é possível criar outros balanceadores no mesmo servidor.
  • No campo bind pode ser informado o IP que receberá as conexões a serem balanceadas. Caso opte por colocar o caractere “*” (asterisco), o HAProxy irá receber conexões em todos os endereços do servidor. No último parâmetro do campo bind, é necessário inserir o caminho para um arquivo contendo:
○ a chave do certificado,
○ o certificado
○ certificados intermediários.
Basta colocar estes 3 dados, um abaixo do outro, no mesmo arquivo.
  • Para manter a persistência de conexões com o mesmo servidor de backend, deve-se ter a entrada balance configurada para utilizar o IP de origem da requisição.
  • O campo default_backend especifica para qual conjunto de servidores as conexões devem ser direcionadas.

Considerações

O uso do HAProxy não exige nenhuma configuração adicional nos servidores de aplicação (backends). Entretanto, os servidores de backend não receberão as requisições a partir dos endereços dos clientes reais. Todas as requisições serão feitas a partir do IP do servidor onde roda o HAProxy. Para que a aplicação tenha a visão do IP do cliente, o desenvolvedor deverá utilizar o campo X-FORWARDED-FOR no cabeçalho da requisição.

Outro ponto importante é que em balanceamento de conexões SSL, utilizando a configuração descrita neste artigo, toda a negociação dos parâmetros da conexão SSL é feita diretamente pelo HAproxy, retirando esta carga do servidor que roda a aplicação.

Para mais informações, consulte a documentação da ferramenta: http://www.haproxy.org/#docs

Comandos importantes

  • Iniciar o HAProxy automaticamente
systemctl enable haproxy

  • Iniciar manualmente o HAProxy
systemctl start haproxy

  • Para manualmente o HAProxy
systemctl stop haproxy

  • Recarregar as configurações do HAProxy. (Este procedimento não interrompe o balanceamento de conexões)
systemctl reload haproxy