NGINX Open Source com Balanceamento de Carga e Persistência de Sessão

Atualmente, a maioria dos sistemas disponíveis na Internet são críticos e precisam ficar online todo o tempo. O Balanceamento de Carga é uma opção para que os serviços fiquem disponíveis com uma Alta Disponibilidade e o NGINX Open Source se mostra uma excelente escolha para tal cenário.

[ Hits: 13.715 ]

Por: Fabiano Furtado em 29/09/2016


Introdução



A Alta Disponibilidade (High Availability ou HA) é um recurso essencial para os serviços disponibilizados na Internet. Uma das formas de se ter HA é utilizarmos o recurso de balanceamento de carga (Load Balancing ou LB) em vários servidores backend.

O NGINX[1] Open Source já possui uma solução de LB[2] nativa através da utilização de algumas diretrizes especiais como o ip_hash[3]. Esta solução inclusive oferece o recurso de persistência de sessão[4], porém ela definitivamente não pode ser considerada um LB eficiente, pois quando diversos clientes estão atrás de um NAT[5] ou proxy ela se tornará um grande problema.

Ou seja, em um cenário onde poderemos ter vários clientes acessando nosso servidor com o mesmo endereço IP e o balanceamento de carga é feito tomando como base o endereço IP de origem, a carga não será distribuída de maneira homogênea entre os servidores backend, o que comprometerá toda a solução.

A partir da versão 1.7.2 do NGINX Open Source, a diretiva hash[6] foi disponibilizada e podemos utilizá-la em conjunto com outras configurações para obtermos o resultado almejado.

Como funciona

Toda a lógica é baseada na configuração abaixo, a qual será explanada ao longo do artigo.

1	upstream us_backend {
2	  hash $upstream_grp;
3	  server backend1;
4	  server backend2;
5	}
6
7	split_clients "client${remote_addr}${http_user_agent}${date_gmt}" $upstream_var {
8	  50.0%   "backend1";
9	  *       "backend2";
10	}
11
12	map $cookie_route $upstream_grp {
13	  default         $upstream_var;
14	  "backend1"      "backend1";
15	  "backend2"      "backend2";
16	}
17
18	server {
19	   listen       80;
20	   server_name  apptest;
21
22	   location / {
23	      add_header Set-Cookie 'route=$upstream_grp;Path=/;HttpOnly';
24	      proxy_pass http://us_backend;
25	   }
26	}

    Próxima página

Páginas do artigo
   1. Introdução
   2. Primeiro acesso do cliente: recebendo o cookie "route" do servidor
   3. Colocando o servidor backend em manutenção: Minimizando a perda de sessão
   4. Aumentando a segurança
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Mantendo seus dados em segurança com o Keep

Resolvendo dependências no Slackware com slackpkg

Garantindo o funcionamento de serviços com o restartd

WeeChat - Um (O) cliente IRC CLI

Acesso remoto utilizando FreeNX

  
Comentários
[1] Comentário enviado por mpsnet em 30/09/2016 - 10:42h

Parabéns pelo artigo.
Pretendo utilizar seu artigo para aprimorar meu sistema. Mas desculpe minha ignorância;
- como configuro os outros backends (tem que instalar o nginx neles) ?
- como faço para configurar/gerar o hash nos backends ?

Grato

[2] Comentário enviado por fusca em 30/09/2016 - 13:06h

Obrigado mpsnet!

Olha... não existe ignorância. Ninguém nasce sabendo de nada. Basta um pouco de estudo, dedicação e compromisso com aquilo que se deseja alcançar que a sabedoria aparece.

Sobre a primeira pergunta, os backends não precisam do NGINX. Por se tratar de um proxy reverso, somente a borda precisa dele instalado. No NGINX, basta colocar mais backend na conf, exemplo... backend3, backend4, ....

Em relação à outra dúvida, o HASH é utilizado para "esconder" o nome real dos seus backends. Você pode usar qualquer nome (exemplo: b1, b2, b3, ...), mas, por questões de segurança, sugiro você usar um HASH, pois o mesmo aparece no cookie enviado para o cliente. No Linux, vc pode usar o comando "sha1sum" ou "sha224sum" ou "sha256sum" ou "sha384sum" ou "sha512sum" para gerar o HASH.

Espero ter ajudado.


[1] Comentário enviado por mpsnet em 30/09/2016 - 10:42h

Parabéns pelo artigo.
Pretendo utilizar seu artigo para aprimorar meu sistema. Mas desculpe minha ignorância;
- como configuro os outros backends (tem que instalar o nginx neles) ?
- como faço para configurar/gerar o hash nos backends ?

Grato

[3] Comentário enviado por mpsnet em 30/09/2016 - 13:37h

Ajudou sim
Obrigado

[4] Comentário enviado por rdgovieira em 16/06/2018 - 13:24h

Muito bom o artigo, consegui entender e aplicar na minha infraestrutura com sucesso.
Muito obrigado!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts