Nginx: Configurando como load balancer

Hoje vou mostrar um recurso interessante do Nginx para balanceamento de carga. O Nginx possui suporte para três mecanismos de balanceamento de carga:

– round-robin: As requisições são distribuidas no modelo round-robin onde a distribuição é feita de forma circular entre os parcicipantes do conjunto. Ou seja, se tivermos dois componentes, funciona assim: 1 – 2 – 1 – 2… Se tivermos três, temos o seguinte funcionamento: 1 – 2 – 3 – 1 – 2 – 3… O round-robin é o modelo padrão de funcionamento;

– least-connected: A próxima requisição é direcionada para o componente com o menor número de conexões ativas;

– ip-hash: Usado para distribuir as requisições entre os componentes de baseado no endereço IP do cliente que origina a requisição.

Eu não vou entrar em configurações mais complexas e caso esteja interessado em se aprofundar mais no assunto, e ver outras opções disponíveis como por exemplo atribuição de peso em servidores, slow start, persistência de sessão, limite de conexões, healthcheck e etc, visite: http://nginx.com/resources/admin-guide/load-balancer/

Um cenário real seria um servidor com o Nginx instalado servindo como loadbalancer, distribuindo a carga entre dois servidores web, como no exemplo abaixo:

lb

Como neste laboratório não temos dois servidores, cada um com seu respectivo endereço IP, vou direcionar as requisições feitas para loadbalancer.ricardomartins.com.br para dois outros sites via round-robin (no caso para distrowatch.com e br-linux.org) apenas para demonstrar o funcionamento.

Vou fazer assim pois não adiantaria criar outros dois hosts virtuais (server1.ricardomartins.com.br e server2.ricardomartins.com.br) na mesma máquina uma vez que o balanceamento não funcionaria por estarem sob o mesmo endereço IP do próprio loadbalancer.ricardomartins.com.br.

Em um cenário real, deveria apontar para outros dois servidores web com o mesmo conteúdo, para efetivamente distribuir a carga dois servidores que estejam servindo o mesmo site/conteúdo.

Abaixo a configuração do /etc/nginx/conf.d/loadbalancer.conf

server {
listen 80;
server_name loadbalancer.ricardomartins.com.br;
location / {
proxy_pass http://ricardo;
}
}

upstream ricardo {
server br-linux.org;
server distrowatch.com;
}

Desta forma, quando chamar loadbalancer.ricardomartins.com.br, como estou usando a configuração padrão de round-robin, cada hora estarei sendo direcionado para um servidor, no nosso caso, para br-linux.org e distrowatch.com. Vejam o teste:

* Caso queira saber como fazer balanceamento com o HAProxy, veja aqui: http://www.ricardomartins.com.br/balanceamento-de-carga-com-haproxy/

  • Ótimo artigo amigo. Você sabe informar se funciona com HTTPS?
    No bloco upstream eu posso colocar os IP´s dos servidores?
    Você sabe se existe um limite de servidores (quantidade) para o balanceamento?
    Funciona com o servidor configurado com FastCGI ou Redi Cashe?
    Abraço!

  • Carlos

    Ricardo o que você indica para balanceamento de carga de servidor web, haproxy ou Nginx

    • Ricardo Martins

      Oi Carlos,
      Sinceramente, se é balanceamento de carga para servidor web, vai de Nginx ;-D

      • Carlos

        Na verdade preciso de HA para servidor web, com aplicações em PHP por exemplo.