HAProxy : Utilizando como Proxy Reverso

Neste post será apresentado como utilizar o HAPROXY para ser utilizado como um proxy reverso na rede.

Em nosso exemplo será criado um contexto para uma aplicação no Jboss , para que a gente possa ver a requisição batendo na porta 80 e chegando em seguida na porta 8080 e 8081.

Captura de Tela 2016-05-28 às 20.53.16

Lembrando que em um ambiente de proxy reverso estamos configurando por uma questão de segurança, apenas servidores em uma rede DMZ que tem regra de firewall e permissão conseguem encaminhar a requisição para um servidor de aplicação, não se trata de uma configuração somente para deixar a url amigável.

1) Ambiente :

10.0.0.38 – HAPROXY
10.0.0.51 – Jboss-01
10.0.0.52 – Jboss-02

2) Configurando o Jboss :

Configuração do Jboss / Wildfly :

http://fajlinux.com.br/appserver/wildfly-standalone/

Aplicação deployada nos servidores de aplicação :

https://github.com/fabioabreureis/Pacotes/blob/master/HelloWorld.war

3) Configuração do HAPROXY :

Em nosso exemplo iremos configurar via YUM

yum install haproxy  -y 

Confirme a versão com o comando haproxy -v

Captura de Tela 2016-05-14 às 13.08.04

Arquivo de configuração inicial :

# Global settings
global
    log         127.0.0.1 local2

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     15000
    user        haproxy
    group       haproxy
    daemon


# Default config
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


# Dashboard
listen stats :4997
mode http
stats   enable
stats   hide-version
stats   refresh 30s
stats   show-node
stats realm Haproxy\ Statistics
stats auth admin:haproxy
stats uri       /haproxy

# Frontends settings
frontend  http-in
    bind *:80

# ACLs
  default_backend bk_fajlinux

# Backend settings
backend bk_fajlinux
 mode http
 server localhost 127.0.0.1:80

4) Configurando Proxy Reverso :

Segue abaixo a descrição das configurações utilizadas nos backends :

  • option httplog – habilita log http
  • option dontlognull – não loga conexões de checagem, evita log poluído
  • option redispatch – limpa o cookie caso o backend caia
  • option forwardfor – para empurrar o ip do cliente para o backend
  • option httpclose – encerra conexões que já deveriam ter sido encerradas
  • option forceclose – encerra conexões que já deveriam ter sido encerradas
  • option persist – habilitando persistentica
  • cookie SERVERID insert indirect nocache – injeta cookie na conexao
  • balance roundrobin – tipo de balanceamento
  • check – verifica se a porta está aberta no servidor do pool
  • cookie – nome do cookie que será injetado no lado do cliente
  • backup – A maquina só vai entrar se uma instância do pool estiver fora
  • inter – checagens no backend a cada 2 segundos
  • rise – A maquina só volta para o pool se tiver 2 checagens positivas
  • fall – A maquina só sairá do pool se tiver pelo menos 3 checagens negativas
  • maxconn – número máximo de conexões que a instância deve receber
  • weight – quanto maior o valor mais conexões vão para ele

 

 

4.1) Proxy Reverso Simples :

Neste exemplo utilizaremos duas configurações onde uma será usada a url e outra um subdiretório.

Edite a configuração inicial utilizando o bloco da configuração abaixo :

# ACL for URL
    acl host_app1 hdr(host) -i app01.example.com

# ACL for  Subdirectories
    acl host_app2 path_beg -i /HelloWorld

use_backend app1 if host_app1
use_backend app2 if host_app2
default_backend bk_fajlinux

# Backend settings
backend bk_fajlinux
 mode http
 server localhost 127.0.0.1:80

backend app1 
mode http
cookie  SERVERID insert indirect nocache
option httplog
option dontlognull
option forwardfor
server app01 10.0.0.51:8080

backend app2         
mode http
cookie  SERVERID insert indirect nocache
option httplog
option dontlognull
option forwardfor
server app02 10.0.0.52:8081

Chamando a url http://app01.example.com/HelloWorld/index.jsp

Captura de Tela 2016-05-28 às 21.47.40

Chamando a url http://app02.example.com/HelloWorld

Captura de Tela 2016-05-28 às 21.50.21

4.2) Proxy Balanceado :

No exemplo abaixo o backend está balanceando as requisições entre as aplicações

# ACL for URL
    acl host_applb hdr(host) -i applb.example.com

use_backend applb if host_applb
default_backend bk_fajlinux

# Backend settings
backend bk_fajlinux
 mode http
 server localhost 127.0.0.1:80

backend applb
mode http
cookie  SERVERID insert indirect nocache
option httplog
option dontlognull
option redispatch
option forwardfor
option httpclose
option forceclose
option persist
server app01 10.0.0.51:8080 cookie A weight 1 maxconn 5000 inter 2s rise 2 fall 3 check
server app02 10.0.0.52:8081 cookie B weight 1 maxconn 5000 inter 2s rise 2 fall 3 check 

Chamando a url http://applb.example.com/HelloWorld

Captura de Tela 2016-05-28 às 22.19.58

Estatísticas via console :

Captura de Tela 2016-05-28 às 22.21.52

Referências :

http://blog.haproxy.com/2012/03/29/load-balancing-affinity-persistence-sticky-sessions-what-you-need-to-know/
http://gutocarvalho.net/octopress/2013/03/15/haproxy-balanceando-jboss/