Balanceamento de carga do Nginx com HAProxy no Centos7

O HAProxy (High Availability Proxy) é um software balanceador de carga de código aberto. Ele foi escrito por Willy Tarreau em C, suporta SSL, compressões, keep-alive, formatos de log customizados e reescrita de cabeçalho.

O HAProxy é um servidor proxy rápido, leve e balanceador de carga com baixo consumo de memória e processador. Ele é usado por grandes sites como o Github, StackOverflow, Reddit, Tumblr, Twitter e outros. O software tornou-se o mais popular balanceador de carga e servidor proxy nos últimos anos.

O HAProxy pode ser executado em dois modos: o modo de TCP Camada 4 e o Modo de HTTP Camada 7. No modo de TCP da Camada 4, o HAProxy encaminha os pacotes RAW TCP do cliente para os servidores de aplicativos. No modo HTTP da Camada 7, o HAProxy está analisando o cabeçalho HTTP antes de encaminhá-los para os servidores de aplicativos. Neste tutorial, usaremos o Nginx como o servidor Web que suporta apenas o modo HTTP da Camada 7.

Maiores informações em http://www.haproxy.org/

Neste laboratório vamos utilizar 3 máquinas virtuais VMs, uma delas será o balanceador de carga e as outras duas rodarão o servidor web Nginx.

Teremos as seguintes configurações no arquivo de hosts de cada VM.

192.168.122.180         loadbalancer.local              loadbalancer

192.168.122.216         nginx1.local                    nginx1

192.168.122.247         nginx2.local                    nginx2

No servidor HAProxy (loadbalancer) vamos instalar o software, porém o ideal é seguir as boas práticas, atualizar o servidor e depois instalar o HAProxy.

yum -y update

yum -y install haproxy

Com o software instalado vamos entrar no diretório de configuração e fazer uma cópia do arquivo de configuração.

cd /etc/haproxy/

mv haproxy.cfg haproxy.cfg.orig

Agora vamos criar um arquivo de configuração novo para o haproxy. O detalhe mais importante neste arquivo ficam nas duas últimas linhas onde vamos adicionar o IP e nome dos servidores Nginx. Observe também (em negrito) que estamos habilitando um frontend Web para acompanhar estatísticas do HAProxy.

vim haproxy.cfg

#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global

    log         127.0.0.1 local2     #Log configuration

 

    chroot      /var/lib/haproxy

    pidfile     /var/run/haproxy.pid

    maxconn     4000                

    user        haproxy             #Haproxy running under user and group "haproxy"

    group       haproxy

    daemon

 

    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats

 

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http

    log                     global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor       except 127.0.0.0/8

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeout queue           1m

    timeout connect         10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 3000

 

#---------------------------------------------------------------------

#HAProxy Monitoring Config

#---------------------------------------------------------------------

listen haproxy3-monitoring *:8080                #Haproxy Monitoring run on port 8080

    mode http

    option forwardfor

    option httpclose

    stats enable

    stats show-legends

    stats refresh 5s

    stats uri /stats                             #URL for HAProxy monitoring

    stats realm Haproxy\ Statistics

    stats auth howtoforge:howtoforge            #User and Password for login to the monitoring dashboard

    stats admin if TRUE

    default_backend app-main                    #This is optionally for monitoring backend

 

#---------------------------------------------------------------------

# FrontEnd Configuration

#---------------------------------------------------------------------

frontend main

    bind *:80

    option http-server-close

    option forwardfor

    default_backend app-main

 

#---------------------------------------------------------------------

# BackEnd roundrobin as balance algorithm

#---------------------------------------------------------------------

backend app-main

    balance roundrobin                                     #Balance algorithm

    option httpchk HEAD / HTTP/1.1\r\nHost:\ localhost    #Check the server application is up and healty - 200 status code

    server nginx1 192.168.122.216:80 check                 #Nginx1 

    server nginx2 192.168.122.247:80 check                 #Nginx2

Agora vamos editar o arquivo de configuração do rsyslog para gerar estatísticas do HAProxy. Desmarque o comentário nas seguintes linhas:

vim /etc/rsyslog.conf

$ModLoad imudp

$UDPServerRun 514

Vamos criar um novo arquivo de configuração do rsyslog para o haproxy e neste arquivo configurar as duas linhas abaixo:

cd /etc/rsyslog.d/

vim haproxy.conf

local2.=info     /var/log/haproxy-access.log    #For Access Log

local2.notice    /var/log/haproxy-info.log      #For Service Info - Backend, loadbalancer

Após configurar o rsyslog para o HAProxy vamos restartar e rsyslog e rodar o haproxy, também não podemos esquecer de colocar na inicialização do sistema.

systemctl restart rsyslog

systemctl start haproxy

systemctl enable haproxy

Chegamos ao final da configuração do HAProxy no servidor balanceador. Agora vamos instalar o Nginx nos outros dois servidores e fazer alguns ajustes.

yum -y update

yum -y install epel-release

yum install nginx

systemctl start nginx.service

systemctl enable nginx.service

No servidor Nginx1 vamos criar uma página index.html com a mensagem Servidor Nginx1 para podermos visualizar o balanceamento ocorrendo. No servidor Nginx2 também vamos criar uma página index.html porém com a mensagem Servidor Nginx2.

cd /usr/share/nginx/html/

echo "<h1>Servidor Nginx1</h1>" > index.html

echo "<h1>Servidor Nginx2</h1>" > index.html

Até aqui chegamos ao final do laboratório, portanto deve estar funcionando o balanceamento. Logo abaixo fiz um vídeo demonstrando!

Não se esqueça de acessar o frontend do HAProxy para visualizar as estatísticas geradas pelo rsyslog. O endereço é o IP ou nome do servidor loadbalancer, aquele que tem o software HAProxy instalado. O usuário e senha é howtoforge!

http://loadbalancer.local:8080/stats