Skip to main content

HAPROXY com persistência de URL

Informações geradas pelo ChatGPT.

Sim, é possível configurar o HAProxy para atender tanto HTTP (porta 80) quanto HTTPS (porta 443) ao mesmo tempo. Isso pode ser feito configurando dois frontends separados — um para HTTP e outro para HTTPS — e ambos encaminhando as requisições para o mesmo backend, de modo que o balanceamento de carga e a persistência por URL sejam aplicados de maneira uniforme para ambos os protocolos.

Exemplo de Configuração para HTTP e HTTPS ao Mesmo Tempo

Aqui está um exemplo de configuração onde o HAProxy aceita tráfego HTTP e HTTPS e roteia as requisições para o mesmo backend, mantendo a persistência baseada na URL para ambos os protocolos:

haproxy
global
    log /dev/log local0
    log /dev/log local1
    notice maxconn 2000
defaults
     log global
     option httplog
     option dontlognull
     timeout connect 5000ms
     timeout client 50000ms
     timeout server 50000ms
# Frontend HTTP (porta 80)
frontend http_front
     bind *:80 
     acl is_http_request path_reg ^/.* # Captura qualquer URL
     use_backend default_backend if is_http_request
# Frontend HTTPS (porta 443)
frontend https_front
     bind *:443 ssl crt /etc/ssl/certs/meucertificado.pem # Certificado SSL
    acl is_https_request path_reg ^/.* # Captura qualquer URL
    use_backend default_backend if is_https_request
# Backend
     backend default_backend
     balance roundrobin 
   stick-table type string size 200k expire 30m store gpc0
    stick on url_param(url) # Persistência baseada na URL
    cookie SERVERID insert indirect nocache
    server server1 192.168.1.1:80 check # Servidor HTTP
    server server2 192.168.1.2:80 check # Servidor HTTP
    server server3 192.168.1.3:80 check # Servidor HTTP 

Explicação da Configuração:

  1. Frontend HTTP:

    • bind *:80: O frontend escuta na porta 80 para tráfego HTTP.

    • acl is_http_request path_reg ^/.*: A ACL captura qualquer URL para redirecioná-la para o backend.

    • use_backend default_backend if is_http_request: Se a requisição for HTTP, ela é direcionada para o default_backend.

  2. Frontend HTTPS:

    • bind *:443 ssl crt /etc/ssl/certs/meucertificado.pem: Este frontend escuta na porta 443 para tráfego HTTPS e usa o certificado SSL fornecido no arquivo /etc/ssl/certs/meucertificado.pem.

    • acl is_https_request path_reg ^/.*: A ACL captura qualquer URL, assim como no frontend HTTP.

    • use_backend default_backend if is_https_request: Se a requisição for HTTPS, ela é direcionada para o default_backend.

  3. Backend:

    • O backend é compartilhado entre ambos os frontends HTTP e HTTPS, com persistência baseada na URL usando o stick-table para garantir que as requisições para a mesma URL sejam sempre roteadas para o mesmo servidor.

    • cookie SERVERID insert indirect nocache: Garante a persistência usando cookies.

    • Os servidores backend continuam na porta 80 (HTTP), porque o HAProxy está fazendo a terminação SSL.

Como Funciona:

  1. Requisição HTTP:

    • O cliente acessa a URL usando http://meusite.com/pagina1.

    • O HAProxy recebe a requisição na porta 80 e a encaminha para um dos servidores backend (server1, server2, server3), com base no balanceamento de carga roundrobin.

    • O servidor backend responde, e o HAProxy registra a URL /pagina1 e o servidor que a atendeu.

  2. Requisição HTTPS:

    • O cliente acessa a URL usando https://meusite.com/pagina1.

    • O HAProxy recebe a requisição na porta 443, faz a descriptografia SSL e encaminha para o mesmo backend (porta 80), utilizando o mesmo servidor que atendeu a primeira requisição HTTP para aquela URL.

    • O HAProxy verifica a tabela de stickiness e direciona a requisição para o mesmo servidor que atendeu a primeira requisição, mantendo a persistência.

  3. Persistência para Todos os Usuários:

    • A persistência é mantida independentemente de ser uma requisição HTTP ou HTTPS, porque a persistência está baseada na URL (stick on url_param(url)), não em cookies ou IP do cliente.

    • Todos os usuários que acessarem a mesma URL (seja por HTTP ou HTTPS) serão direcionados para o mesmo servidor backend que atendeu a primeira requisição para aquela URL.

Certificado SSL:

O caminho /etc/ssl/certs/meucertificado.pem deve apontar para o certificado SSL e a chave privada do seu domínio. Se você estiver usando o Let's Encrypt ou outra autoridade certificadora (CA), basta colocar o arquivo .pem correto que contenha o certificado público e a chave privada.

Caso você precise gerar um certificado SSL autoassinado, pode usar o seguinte comando openssl:

bash
openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/private/meuchave.key -out /etc/ssl/certs/meucertificado.pem -days 365

Esse comando gera um certificado autoassinado, o que é útil para testes ou ambientes internos, mas para produção, recomenda-se o uso de um certificado de uma autoridade certificadora (CA) confiável.


Conclusão:

  • Sim, o HAProxy pode atender tanto HTTP quanto HTTPS ao mesmo tempo, com a mesma configuração de persistência por URL para ambos os protocolos.

  • A configuração utiliza dois frontends separados (um para HTTP e outro para HTTPS), mas ambos encaminham as requisições para o mesmo backend, garantindo que a persistência de URL seja aplicada de forma consistente, independentemente do protocolo.

  • A terminação SSL acontece no HAProxy, o que significa que ele descriptografa as requisições HTTPS e as envia como HTTP para os servidores backend.