Estratégias de balanceamento de carga no Nginx

Conceito de balanceamento de carga

O balanceamento de carga é uma técnica fundamental para distribuir requisições de rede entre múltiplos servidores, evitando sobrecarga e garantindo alta disponibilidade. No Nginx, essa funcionalidade é implementada via proxy reverso, onde o servidor atua como intermediário, encaminhando o tráfego para um conjunto de servidores back-end definidos no módulo upstream.

Configuração básica do módulo upstream

Para definir um pool de servidores, utiliza-se a diretiva upstream dentro do bloco http. Cada servidor é listado com seu endereço IP e porta. Exemplo:


# Definição do grupo de servidores back-end
upstream backend_pool {
    server 10.0.0.1:8080;
    server 10.0.0.2:8081;
    server 10.0.0.3:8082;
}

Para redirecionar o tráfego para esse grupo, configura-se o proxy reverso na seção location:


location / {
    proxy_pass http://backend_pool;
}

Estratégias de balanceamento suportadas

O módulo upstream do Nginx suporta diversas estratégias para distribuir as requisições. As principais são:

1. Round-robin (padrão)

Nesta abordagem, as requisições são distribuídas sequencialmente entre os servidores. É a configuração implícita quando nenhuma outra estratégia é especificada. Parâmetros adicionais podem incluir max_fails e fail_timeout para tratar falhas.


upstream backend_pool {
    server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:8081;
    server 10.0.0.3:8082 backup;
}

Neste exemplo, o servidor 10.0.0.3 é designado como backup, sendo utilizado apenas quando os demais estiverem indisponíveis.

2. Peso (weight)

Permite atribuir pesos diferentes aos servidores, direcionando mais tráfego para aqueles com maior capacidade. O valor padrão de peso é 1.


upstream backend_pool {
    server 10.0.0.1:8080 weight=4;
    server 10.0.0.2:8081 weight=2;
    server 10.0.0.3:8082;
}

Aqui, o servidor 10.0.0.1 receberá aproximadamente o dobro de requisições em comparação com 10.0.0.2.

3. ip_hash

As requisições são alocadas com base no hash do endereço IP do cliente. Isso garante que um cliente específico sempre seja direcionado para o mesmo servidor back-end, útil para manter sessões de usuário.


upstream backend_pool {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8081;
}

4. least_conn

Direciona a requisição para o servidor com o menor número de conexões ativas, otimizando o uso de recursos em cenários com tempos de resposta variáveis.


upstream backend_pool {
    least_conn;
    server 10.0.0.1:8080 weight=3;
    server 10.0.0.2:8081;
    server 10.0.0.3:8082 backup;
}

5. fair (terceiros)

Aloca requisições com base no tempo de resposta dos servidores, priorizando aqueles que respondem mais rapidamente. Requer a instalação de módulos adicionais.


upstream backend_pool {
    server 10.0.0.1:8080;
    server 10.0.0.2:8081;
    fair;
}

6. url_hash (terceiros)

Distribui requisições pelo hash da URL solicitada, garantindo que a mesma URL sempre seja tratada pelo mesmo servidor. Isso pode melhorar a taxa de acerto de cache.


upstream backend_pool {
    hash $request_uri;
    server 10.0.0.1:8080;
    server 10.0.0.2:8081;
}

Parâmetros comuns para servidores no upstream

Cada entrada de servidor pode incluir opções para controle de comportamento:

  • down: marca o servidor como permanentemente indisponível.
  • weight: define a prioridade de roteamento.
  • max_fails: número máximo de falhas permitidas antes de considerar o servidor offline.
  • fail_timeout: tempo durante o qual as falhas são contadas.
  • backup: reserva o servidor para uso em caso de falha dos principais.

Exemplo de configuração completa

Um cenário prático com ip_hash e parâmetros de tolerância a falhas:


http {
    upstream app_servers {
        ip_hash;
        server 192.168.0.10:8080 max_fails=2 fail_timeout=15s;
        server 192.168.0.11:8081;
        server 192.168.0.12:8082 backup;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://app_servers;
        }
    }
}

Tags: nginx Balanceamento de Carga Proxy Reverso upstream round-robin

Publicado em 7-24 01:48