# Nginx - Formas de Balanceamento

Fonte: [https://nginx.org/en/docs/http/load\_balancing.html](https://nginx.org/en/docs/http/load_balancing.html)

## <span dir="auto">Usando nginx como balanceador de carga HTTP</span>

<table id="bkmrk-m%C3%A9todos-de-balanceam" width="100%"><tbody><tr><td align="left">[<span dir="auto">Métodos de balanceamento de carga</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_methods)  
[<span dir="auto">Configuração padrão de balanceamento de carga</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_configuration)  
[<span dir="auto">Balanceamento de carga menos conectado</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_with_least_connected)  
[<span dir="auto">Persistência de sessão</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_with_ip_hash)  
[<span dir="auto">Balanceamento de carga ponderado</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_weighted_load_balancing)  
[<span dir="auto">Verificações de integridade</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_health_checks)  
[<span dir="auto">Leitura adicional</span>](https://nginx.org/en/docs/http/load_balancing.html#nginx_load_balancing_additional_information)  
</td></tr></tbody></table>

<center id="bkmrk-introdu%C3%A7%C3%A3o">#### <span dir="auto">Introdução</span>

</center><span dir="auto">O balanceamento de carga entre várias instâncias de aplicativos é uma técnica comumente usada para otimizar a utilização de recursos, maximizar a taxa de transferência, reduzir a latência e garantir configurações tolerantes a falhas.</span>

<span dir="auto">É possível usar o nginx como um balanceador de carga HTTP muito eficiente para distribuir tráfego para vários servidores de aplicativos e melhorar o desempenho, a escalabilidade e a confiabilidade de aplicativos da web com o nginx.</span>

<a name="nginx_load_balancing_methods"></a>

<center id="bkmrk-m%C3%A9todos-de-balanceam-1">#### <span dir="auto">Métodos de balanceamento de carga</span>

</center><span dir="auto">Os seguintes mecanismos (ou métodos) de balanceamento de carga são suportados no nginx:</span>

- <span dir="auto">round-robin — as solicitações aos servidores de aplicativos são distribuídas em formato round-robin,</span>
- <span dir="auto">menos conectado — a próxima solicitação é atribuída ao servidor com o menor número de conexões ativas,</span>
- <span dir="auto">ip-hash — uma função hash é usada para determinar qual servidor deve ser selecionado para a próxima solicitação (com base no endereço IP do cliente).</span>

<a name="nginx_load_balancing_configuration"></a>

<center id="bkmrk-configura%C3%A7%C3%A3o-de-bala">#### <span dir="auto">Configuração de balanceamento de carga padrão</span>

</center><span dir="auto">A configuração mais simples para balanceamento de carga com nginx pode ser parecida com a seguinte:</span>

> ```
> http {
>     upstream myapp1 {
>         servidor srv1.example.com;
>         servidor srv2.example.com;
>         servidor srv3.example.com;
>     }
> 
>     servidor {
>         ouvir 80;
> 
>         localização / {
>             proxy_pass http://myapp1;
>         }
>     }
> }
> ```

<span dir="auto">No exemplo acima, há 3 instâncias do mesmo aplicativo em execução em srv1-srv3. Quando o método de balanceamento de carga não é configurado especificamente, o padrão é round-robin. Todas as solicitações são </span>[<span dir="auto">encaminhadas por proxy</span>](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass)<span dir="auto"> para o grupo de servidores myapp1, e o nginx aplica o balanceamento de carga HTTP para distribuir as solicitações.</span>

<span dir="auto">A implementação de proxy reverso no nginx inclui balanceamento de carga para HTTP, HTTPS, FastCGI, uwsgi, SCGI, memcached e gRPC.</span>

<span dir="auto">Para configurar o balanceamento de carga para HTTPS em vez de HTTP, basta usar “https” como protocolo.</span>

<span dir="auto">Ao configurar o balanceamento de carga para FastCGI, uwsgi, SCGI, memcached ou gRPC, use as diretivas </span>[<span dir="auto">fastcgi\_pass</span>](https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_pass)<span dir="auto"> , </span>[<span dir="auto">uwsgi\_pass</span>](https://nginx.org/en/docs/http/ngx_http_uwsgi_module.html#uwsgi_pass)<span dir="auto"> , </span>[<span dir="auto">scgi\_pass</span>](https://nginx.org/en/docs/http/ngx_http_scgi_module.html#scgi_pass)<span dir="auto"> , </span>[<span dir="auto">memcached\_pass</span>](https://nginx.org/en/docs/http/ngx_http_memcached_module.html#memcached_pass)<span dir="auto"> e </span>[<span dir="auto">grpc\_pass</span>](https://nginx.org/en/docs/http/ngx_http_grpc_module.html#grpc_pass)<span dir="auto"> respectivamente.</span>

<a name="nginx_load_balancing_with_least_connected"></a>

<center id="bkmrk-balanceamento-de-car">#### <span dir="auto">Balanceamento de carga menos conectado</span>

</center><span dir="auto">Outra disciplina de balanceamento de carga é a menos conectada. Essa abordagem permite controlar a carga em instâncias de aplicativos de forma mais justa em situações em que algumas solicitações demoram mais para serem concluídas.</span>

<span dir="auto">Com o balanceamento de carga menos conectado, o nginx tentará não sobrecarregar um servidor de aplicativos ocupado com solicitações excessivas, distribuindo as novas solicitações para um servidor menos ocupado.</span>

<span dir="auto">O balanceamento de carga menos conectado no nginx é ativado quando a diretiva </span>[<span dir="auto">least\_conn</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#least_conn)<span dir="auto"> é usada como parte da configuração do grupo de servidores:</span>

> ```
>     upstream myapp1 {
>         conexão_menor;
>         servidor srv1.example.com;
>         servidor srv2.example.com;
>         servidor srv3.example.com;
>     }
> ```

<a name="nginx_load_balancing_with_ip_hash"></a>

<center id="bkmrk-persist%C3%AAncia-de-sess">#### <span dir="auto">Persistência de sessão</span>

</center><span dir="auto">Observe que, com o balanceamento de carga round-robin ou de menor conexão, cada solicitação de cliente subsequente pode ser potencialmente distribuída para um servidor diferente. Não há garantia de que o mesmo cliente será sempre direcionado para o mesmo servidor.</span>

<span dir="auto">Se houver necessidade de vincular um cliente a um servidor de aplicativo específico — em outras palavras, tornar a sessão do cliente "fixa" ou "persistente" em termos de sempre tentar selecionar um servidor específico — o mecanismo de balanceamento de carga ip-hash pode ser usado.</span>

<span dir="auto">Com o ip-hash, o endereço IP do cliente é usado como uma chave de hash para determinar qual servidor em um grupo de servidores deve ser selecionado para as solicitações do cliente. Este método garante que as solicitações do mesmo cliente sejam sempre direcionadas ao mesmo servidor, exceto quando este estiver indisponível.</span>

<span dir="auto">Para configurar o balanceamento de carga ip-hash, basta adicionar a diretiva </span>[<span dir="auto">ip\_hash</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#ip_hash)<span dir="auto"> à configuração do grupo do servidor (upstream):</span>

> ```
> upstream myapp1 {
>     ip_hash;
>     servidor srv1.example.com;
>     servidor srv2.example.com;
>     servidor srv3.example.com;
> }
> ```

<a name="nginx_weighted_load_balancing"></a>

<center id="bkmrk-balanceamento-de-car-2">#### <span dir="auto">Balanceamento de carga ponderado</span>

</center><span dir="auto">Também é possível influenciar ainda mais os algoritmos de balanceamento de carga do nginx usando pesos de servidor.</span>

<span dir="auto">Nos exemplos acima, os pesos do servidor não são configurados, o que significa que todos os servidores especificados são tratados como igualmente qualificados para um método específico de balanceamento de carga.</span>

<span dir="auto">Com o round-robin em particular, isso também significa uma distribuição mais ou menos igual de solicitações entre os servidores — desde que haja solicitações suficientes e quando as solicitações sejam processadas de maneira uniforme e concluídas com rapidez suficiente.</span>

<span dir="auto">Quando o parâmetro </span>[<span dir="auto">de peso</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> é especificado para um servidor, o peso é contabilizado como parte da decisão de balanceamento de carga.</span>

> ```
>     upstream myapp1 {
>         servidor srv1.example.com peso=3;
>         servidor srv2.example.com;
>         servidor srv3.example.com;
>     }
> ```

<span dir="auto">Com essa configuração, a cada 5 novas solicitações serão distribuídas entre as instâncias do aplicativo da seguinte maneira: 3 solicitações serão direcionadas para srv1, uma solicitação irá para srv2 e outra para srv3.</span>

<span dir="auto">Da mesma forma, é possível usar pesos com balanceamento de carga menos conectado e ip-hash nas versões recentes do nginx.</span>

<a name="nginx_load_balancing_health_checks"></a>

<center id="bkmrk-verifica%C3%A7%C3%B5es-de-sa%C3%BAd">#### <span dir="auto">Verificações de saúde</span>

</center><span dir="auto">A implementação de proxy reverso no nginx inclui verificações de integridade do servidor em banda (ou passivas). Se a resposta de um servidor específico falhar com um erro, o nginx marcará esse servidor como falho e tentará evitar a seleção deste servidor para solicitações de entrada subsequentes por um tempo.</span>

<span dir="auto">A diretiva </span>[<span dir="auto">max\_fails</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> define o número de tentativas consecutivas malsucedidas de comunicação com o servidor que devem ocorrer durante </span>[<span dir="auto">o fail\_timeout</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> . Por padrão, </span>[<span dir="auto">max\_fails</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> é definido como 1. Quando definido como 0, as verificações de integridade são desativadas para este servidor. O parâmetro </span>[<span dir="auto">fail\_timeout</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> também define por quanto tempo o servidor será marcado como com falha. Após o intervalo </span>[<span dir="auto">fail\_timeout</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> após a falha do servidor, o nginx começará a sondar o servidor normalmente com as solicitações do cliente ativo. Se as sondagens forem bem-sucedidas, o servidor será marcado como ativo.</span>

<a name="nginx_load_balancing_additional_information"></a>

<center id="bkmrk-leitura-adicional">#### <span dir="auto">Leitura adicional</span>

</center><span dir="auto">Além disso, existem mais diretivas e parâmetros que controlam o balanceamento de carga do servidor no nginx, como </span>[<span dir="auto">proxy\_next\_upstream</span>](https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_next_upstream)<span dir="auto"> , </span>[<span dir="auto">backup</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> , </span>[<span dir="auto">down</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server)<span dir="auto"> e </span>[<span dir="auto">keepalive</span>](https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive)<span dir="auto"> . Para mais informações, consulte nossa </span>[<span dir="auto">documentação de referência</span>](https://nginx.org/en/docs/)<span dir="auto"> .</span>

<span dir="auto">Por último, mas não menos importante, o balanceamento de carga de aplicativos, as verificações de integridade dos aplicativos, o monitoramento de atividades e a reconfiguração dinâmica de grupos de servidores estão disponíveis como parte de nossas assinaturas pagas do NGINX Plus.</span>