# HAPROXY com persistência de URL

Informações geradas pelo ChatGPT.

<article class="w-full text-token-text-primary" data-scroll-anchor="false" data-testid="conversation-turn-14" dir="auto" id="bkmrk-sim%2C-%C3%A9-poss%C3%ADvel-conf">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:

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark"><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">haproxy</div><div class="sticky top-9"><div class="absolute bottom-0 right-0 flex h-9 items-center pr-2"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button aria-label="Copiar" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M7 5C7 3.34315 8.34315 2 10 2H19C20.6569 2 22 3.34315 22 5V14C22 15.6569 20.6569 17 19 17H17V19C17 20.6569 15.6569 22 14 22H5C3.34315 22 2 20.6569 2 19V10C2 8.34315 3.34315 7 5 7H7V5ZM9 7H14C15.6569 7 17 8.34315 17 10V15H19C19.5523 15 20 14.5523 20 14V5C20 4.44772 19.5523 4 19 4H10C9.44772 4 9 4.44772 9 5V7ZM5 9C4.44772 9 4 9.44772 4 10V19C4 19.5523 4.44772 20 5 20H14C14.5523 20 15 19.5523 15 19V10C15 9.44772 14.5523 9 14 9H5Z" fill="currentColor" fill-rule="evenodd"></path></svg>Copiar</button></span></div></div></div><div class="overflow-y-auto p-4" dir="ltr">`global`</div><div class="overflow-y-auto p-4" dir="ltr">`    log /dev/log local0`</div><div class="overflow-y-auto p-4" dir="ltr">`    log /dev/log local1 `</div><div class="overflow-y-auto p-4" dir="ltr">`    notice    maxconn 2000`</div><div class="overflow-y-auto p-4" dir="ltr">  
</div><div class="overflow-y-auto p-4" dir="ltr">`defaults`</div><div class="overflow-y-auto p-4" dir="ltr">`     log     global`</div><div class="overflow-y-auto p-4" dir="ltr">`     option  httplog`</div><div class="overflow-y-auto p-4" dir="ltr">`     option  dontlognull`</div><div class="overflow-y-auto p-4" dir="ltr">`     timeout connect 5000ms`</div><div class="overflow-y-auto p-4" dir="ltr">`     timeout client  50000ms`</div><div class="overflow-y-auto p-4" dir="ltr">`     timeout server  50000ms`</div><div class="overflow-y-auto p-4" dir="ltr">  
</div><div class="overflow-y-auto p-4" dir="ltr">`# Frontend HTTP (porta 80)`</div><div class="overflow-y-auto p-4" dir="ltr">`frontend http_front`</div><div class="overflow-y-auto p-4" dir="ltr"> `    bind *:80 `</div><div class="overflow-y-auto p-4" dir="ltr">`     acl is_http_request path_reg ^/.*  # Captura qualquer URL`</div><div class="overflow-y-auto p-4" dir="ltr">`     use_backend default_backend if is_http_request`</div><div class="overflow-y-auto p-4" dir="ltr">  
</div><div class="overflow-y-auto p-4" dir="ltr">`# Frontend HTTPS (porta 443)`</div><div class="overflow-y-auto p-4" dir="ltr">`frontend https_front`</div><div class="overflow-y-auto p-4" dir="ltr"> `bind *:443 ssl crt /etc/ssl/certs/meucertificado.pem  # Certificado SSL`</div><div class="overflow-y-auto p-4" dir="ltr"> `    acl is_https_request path_reg ^/.*  # Captura qualquer URL`</div><div class="overflow-y-auto p-4" dir="ltr"> `    use_backend default_backend if is_https_request`</div><div class="overflow-y-auto p-4" dir="ltr">  
</div><div class="overflow-y-auto p-4" dir="ltr">`# Backend`</div><div class="overflow-y-auto p-4" dir="ltr"> `backend default_backend`</div><div class="overflow-y-auto p-4" dir="ltr"> `balance roundrobin `</div><div class="overflow-y-auto p-4" dir="ltr">`   stick-table type string size 200k expire 30m store gpc0`</div><div class="overflow-y-auto p-4" dir="ltr"> `  stick on url_param(url)  # Persistência baseada na URL`</div><div class="overflow-y-auto p-4" dir="ltr"> `    cookie SERVERID insert indirect nocache`</div><div class="overflow-y-auto p-4" dir="ltr"> ` server server1 192.168.1.1:80 check  # Servidor HTTP`</div><div class="overflow-y-auto p-4" dir="ltr"> `    server server2 192.168.1.2:80 check  # Servidor HTTP`</div><div class="overflow-y-auto p-4" dir="ltr"> `    server server3 192.168.1.3:80 check  # Servidor HTTP `</div></div></div></div></div></div></div></div></div></div>### Explicação da Configuração:

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">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**.

</div></div></div></div></div></div></div></div>### Como Funciona:

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">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.

</div></div></div></div></div></div></div></div>### 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`:

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark"><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="flex items-center text-token-text-secondary px-4 py-2 text-xs font-sans justify-between h-9 bg-token-sidebar-surface-primary dark:bg-token-main-surface-secondary select-none rounded-t-[5px]">bash</div><div class="sticky top-9"><div class="absolute bottom-0 right-0 flex h-9 items-center pr-2"><div class="flex items-center rounded bg-token-sidebar-surface-primary px-2 font-sans text-xs text-token-text-secondary dark:bg-token-main-surface-secondary"><span class="" data-state="closed"><button aria-label="Copiar" class="flex gap-1 items-center select-none px-4 py-1"><svg class="icon-xs" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M7 5C7 3.34315 8.34315 2 10 2H19C20.6569 2 22 3.34315 22 5V14C22 15.6569 20.6569 17 19 17H17V19C17 20.6569 15.6569 22 14 22H5C3.34315 22 2 20.6569 2 19V10C2 8.34315 3.34315 7 5 7H7V5ZM9 7H14C15.6569 7 17 8.34315 17 10V15H19C19.5523 15 20 14.5523 20 14V5C20 4.44772 19.5523 4 19 4H10C9.44772 4 9 4.44772 9 5V7ZM5 9C4.44772 9 4 9.44772 4 10V19C4 19.5523 4.44772 20 5 20H14C14.5523 20 15 19.5523 15 19V10C15 9.44772 14.5523 9 14 9H5Z" fill="currentColor" fill-rule="evenodd"></path></svg>Copiar</button></span></div></div></div><div class="overflow-y-auto p-4" dir="ltr">`openssl req -x509 -newkey rsa:2048 -keyout /etc/ssl/private/meuchave.key -out /etc/ssl/certs/meucertificado.pem -days 365`</div></div></div></div></div></div></div></div></div></div>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.

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">---

</div></div></div></div></div></div></div></div>### Conclusão:

<div class="text-base my-auto mx-auto py-5 px-6"><div class="mx-auto flex flex-1 text-base gap-4 md:gap-5 lg:gap-6 md:max-w-3xl group/turn-messages focus-visible:outline-none" tabindex="-1"><div class="group/conversation-turn relative flex w-full min-w-0 flex-col agent-turn @xs/thread:px-0 @sm/thread:px-1.5 @md/thread:px-4"><div class="relative flex-col gap-1 md:gap-3"><div class="flex max-w-full flex-col flex-grow"><div class="min-h-8 text-message relative flex w-full flex-col items-end gap-2 whitespace-normal break-words text-start [.text-message+&]:mt-5" data-message-author-role="assistant" data-message-id="caa12d07-b325-4f49-b98c-3d8df5313e04" data-message-model-slug="gpt-4o-mini" dir="auto"><div class="flex w-full flex-col gap-1 empty:hidden first:pt-[3px]"><div class="markdown prose w-full break-words dark:prose-invert dark">- **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.

</div></div></div></div><div class="flex absolute left-0 right-0 flex justify-start">  
</div></div><div class="absolute"><div class="flex items-center justify-center"><svg class="icon-md" fill="none" height="24" viewbox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 13.25C7.98703 13.25 8.45082 13.1505 8.87217 12.9708C8.46129 14.0478 7.62459 15.5792 6.35846 15.76C5.81173 15.8382 5.43183 16.3447 5.50993 16.8914C5.58804 17.4382 6.09457 17.8181 6.6413 17.7399C9.19413 17.3753 10.7256 14.4711 11.169 12.1909C11.4118 10.942 11.3856 9.58095 10.8491 8.44726C10.2424 7.16517 8.92256 6.24402 7.48508 6.25001C5.55895 6.25805 4 7.82196 4 9.74998C4 11.683 5.567 13.25 7.5 13.25Z" fill="currentColor"></path><path d="M16.18 13.25C16.667 13.25 17.1308 13.1505 17.5522 12.9708C17.1413 14.0478 16.3046 15.5792 15.0385 15.76C14.4917 15.8382 14.1118 16.3447 14.1899 16.8914C14.268 17.4382 14.7746 17.8181 15.3213 17.7399C17.8741 17.3753 19.4056 14.4711 19.849 12.1909C20.0918 10.942 20.0656 9.58095 19.5291 8.44726C18.9224 7.16517 17.6026 6.24402 16.1651 6.25001C14.2389 6.25805 12.68 7.82196 12.68 9.74998C12.68 11.683 14.247 13.25 16.18 13.25Z" fill="currentColor"></path></svg></div></div></div></div></div></article><article class="w-full text-token-text-primary" data-scroll-anchor="false" data-testid="conversation-turn-15" dir="auto" id="bkmrk-%C2%A0">Se você deseja configurar o HAProxy para rotear tráfego em **portas diferentes de 80 (HTTP)** e **443 (HTTPS)**, o procedimento é semelhante, mas você deve ajustar a configuração de **frontends** e **backends** para escutar nas portas específicas que deseja utilizar.

A lógica de balanceamento de carga e persistência por URL será a mesma, mas em vez de usar as portas padrão (80 e 443), você configurará o HAProxy para escutar nas portas que você escolher.

### Exemplo de Configuração para Portas Diferentes:

Vamos imaginar que você deseja usar as portas **8080** para HTTP e **8443** para HTTPS, em vez das portas padrão (80 e 443). A configuração seria:

</article><div id="bkmrk-global">global</div><div id="bkmrk-%C2%A0-%C2%A0-log-%2Fdev%2Flog-loc"> log /dev/log local0</div><div id="bkmrk-%C2%A0-%C2%A0-log-%2Fdev%2Flog-loc-1"> log /dev/log local1 notice</div><div id="bkmrk-%C2%A0-%C2%A0-maxconn-2000"> maxconn 2000</div><div id="bkmrk-">  
</div><div id="bkmrk-defaults">defaults</div><div id="bkmrk-%C2%A0-%C2%A0-log%C2%A0-%C2%A0-%C2%A0global"> log global</div><div id="bkmrk-%C2%A0-%C2%A0-option%C2%A0-httplog"> option httplog</div><div id="bkmrk-%C2%A0-%C2%A0-option%C2%A0-dontlogn"> option dontlognull</div><div id="bkmrk-%C2%A0-%C2%A0-timeout-connect-"> timeout connect 5000ms</div><div id="bkmrk-%C2%A0-%C2%A0-timeout-client%C2%A0-"> timeout client 50000ms</div><div id="bkmrk-%C2%A0-%C2%A0-timeout-server%C2%A0-"> timeout server 50000ms</div><div id="bkmrk--1">  
</div><div id="bkmrk-%23-frontend-para-http">\# Frontend para HTTP (porta 8080)</div><div id="bkmrk-frontend-http_front">frontend http_front</div><div id="bkmrk-%C2%A0-%C2%A0-bind-%2A%3A8080%C2%A0-%23-e"> bind *:8080 # Escutando na porta 8080</div><div id="bkmrk-%C2%A0-%C2%A0-acl-is_http_requ"> acl is_http_request path_reg ^/.* # Captura qualquer URL</div><div id="bkmrk-%C2%A0-%C2%A0-use_backend-defa"> use_backend default_backend if is_http_request</div><div id="bkmrk--2">  
</div><div id="bkmrk-%23-frontend-para-http-1">\# Frontend para HTTPS (porta 8443)</div><div id="bkmrk-frontend-https_front">frontend https_front</div><div id="bkmrk-%C2%A0-%C2%A0-bind-%2A%3A8443-ssl-"> bind *:8443 ssl crt /etc/ssl/certs/meucertificado.pem # Certificado SSL</div><div id="bkmrk-%C2%A0-%C2%A0-acl-is_https_req"> acl is_https_request path_reg ^/.* # Captura qualquer URL</div><div id="bkmrk-%C2%A0-%C2%A0-use_backend-defa-1"> use_backend default_backend if is_https_request</div><div id="bkmrk--3">  
</div><div id="bkmrk-%23-backend">\# Backend</div><div id="bkmrk-backend-default_back">backend default_backend</div><div id="bkmrk-%C2%A0-%C2%A0-balance-roundrob"> balance roundrobin</div><div id="bkmrk-%C2%A0-%C2%A0-stick-table-type"> stick-table type string size 200k expire 30m store gpc0</div><div id="bkmrk-%C2%A0-%C2%A0-stick-on-url_par"> stick on url_param(url) # Persistência baseada na URL</div><div id="bkmrk-%C2%A0-%C2%A0-cookie-serverid-"> cookie SERVERID insert indirect nocache</div><div id="bkmrk-%C2%A0-%C2%A0-server-server1-1"> server server1 192.168.1.1:80 check # Servidor HTTP</div><div id="bkmrk-%C2%A0-%C2%A0-server-server2-1"> server server2 192.168.1.2:80 check # Servidor HTTP</div><div id="bkmrk-%C2%A0-%C2%A0-server-server3-1"> server server3 192.168.1.3:80 check # Servidor HTTP</div><article class="w-full text-token-text-primary" data-scroll-anchor="false" data-testid="conversation-turn-15" dir="auto" id="bkmrk-explica%C3%A7%C3%A3o-das-modif"><div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="overflow-y-auto p-4" dir="ltr"></div></div>### Explicação das Modificações:

1. **Frontend HTTP**:
    
    
    - **`bind *:8080`**: O HAProxy agora escuta na porta `8080` para tráfego HTTP, em vez de `80`.
    - **`acl is_http_request path_reg ^/.*`**: A regra ACL captura qualquer URL que for solicitada e a redireciona para o backend.
2. **Frontend HTTPS**:
    
    
    - **`bind *:8443 ssl crt /etc/ssl/certs/meucertificado.pem`**: O HAProxy escuta na porta `8443` para tráfego HTTPS e usa o certificado SSL localizado no caminho `/etc/ssl/certs/meucertificado.pem`. O certificado SSL deve ser válido, seja autoassinado ou de uma autoridade certificadora.
3. **Backend**:
    
    
    - A configuração do **backend** permanece a mesma, com balanceamento de carga baseado em `roundrobin`, persistência por URL usando `stick-table`, e a inserção do cookie `SERVERID` para garantir a persistência.
4. **Servidores Backend**:
    
    
    - **`server server1 192.168.1.1:80 check`**: Os servidores backend continuam sendo configurados na porta `80`, porque o HAProxy irá fazer a **terminação SSL** para o tráfego HTTPS e, em seguida, encaminhá-lo para os servidores backend na porta `80`.

### Fluxo de Funcionamento:

#### 1. **Requisição HTTP (porta 8080)**:

- O cliente acessa a URL `http://meusite.com:8080/pagina1`.
- O HAProxy recebe a requisição na porta `8080`, e com base no balanceamento de carga (roundrobin), encaminha a requisição para um dos servidores backend.
- O servidor que responder à primeira requisição para `/pagina1` será registrado no **stick-table** com a URL `/pagina1`, garantindo que futuras requisições para essa URL sejam roteadas para o **mesmo servidor**.

#### 2. **Requisição HTTPS (porta 8443)**:

- O cliente acessa a URL `https://meusite.com:8443/pagina1`.
- O HAProxy recebe a requisição na porta `8443`, faz a **terminação SSL** (descriptografa o tráfego HTTPS) e, em seguida, redireciona a requisição para os servidores backend na porta `80`.
- O HAProxy verifica na **stick-table** qual servidor foi associado à URL `/pagina1` e direciona a requisição para o **mesmo servidor** que atendeu a primeira requisição.

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

- Independentemente de ser uma requisição HTTP ou HTTPS, a persistência será mantida para todos os usuários com base na URL, garantindo que a URL `/pagina1` seja sempre tratada pelo **mesmo servidor**.

---

### Caso Você Queira Usar Portas Diferentes para Cada Backend:

Se você quiser que o tráfego seja roteado para diferentes portas nos servidores backend, você pode ajustar a configuração para cada servidor backend. Por exemplo, se você tiver servidores que escutam em portas diferentes, a configuração seria algo como:

<div class="contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative bg-token-sidebar-surface-primary"><div class="overflow-y-auto p-4" dir="ltr">backend default_backend  
 balance roundrobin  
 stick-table type string size 200k expire 30m store gpc0  
 stick on url_param(url)  
 cookie SERVERID insert indirect nocache  
 server server1 192.168.1.1:8081 check # Servidor backend escutando na porta 8081  
 server server2 192.168.1.2:8082 check # Servidor backend escutando na porta 8082  
 server server3 192.168.1.3:8083 check # Servidor backend escutando na porta 8083  
</div></div>Essa configuração faria com que cada servidor backend estivesse escutando em portas diferentes, mas o HAProxy ainda aplicaria a persistência e o balanceamento de carga.

### Resumo:

- **Sim, é possível configurar o HAProxy para escutar em portas diferentes de 80 e 443** (por exemplo, 8080 para HTTP e 8443 para HTTPS).
- A persistência de URL e o balanceamento de carga continuam funcionando da mesma forma, **independentemente da porta** que está sendo utilizada.
- A configuração de **terminação SSL** no HAProxy permite que o tráfego HTTPS seja manipulado na porta `8443` e redirecionado para os servidores backend na porta `80` (ou qualquer porta configurada).

</article>