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: 14.731 ]

Por: Fabiano Furtado em 29/09/2016


Primeiro acesso do cliente: recebendo o cookie "route" do servidor



A lógica da nossa configuração para estabelecer a persistência de sessão é baseada na utilização de um cookie, por isso o comportamento do primeiro acesso realizado pelo cliente é diferente dos acessos subsequentes.

Em seu primeiro acesso, o cliente ainda não possui o cookie "route" definido em seu navegador. O NGINX irá adicionar um cookie para o cliente, mas para isso deverá ser processada a variável $upstream_grp (linha 23).

Desta forma, a diretiva map[7] (linha 12) vai inicializar a variável $upstream_grp com o valor padrão (default), ou seja, o valor da variável $upstream_var (linha 13).

Como o valor da variável $upstream_var também é nulo, a diretiva split_clients[8] (linha 7) é chamada para inicializá-la. A inicialização desta variável funciona como uma semente (seed) que identifica o acesso daquele cliente de forma única, pois concatena o endereço IP de origem, o user agent do navegador e a data e hora de acesso, transformando este identificador em um número dentro de um espaço de endereçamento de 32 bits.

De acordo com o nosso exemplo, 50% dos clientes ficará no espaço de endereçamento correspondente ao primeiro servidor backend (backend1) e o restante ficará no espaço de endereçamento correspondente ao segundo servidor backend (backend2).

Detalhe que esta função não executa o método round-robin[4] para escolher o backend e, portanto, podem existir mais clientes acessando um servidor backend que o outro. Esta diferença na quantidade de clientes acessando os servidores tende a se equilibrar quando há vários acessos acontecendo e utilizamos valores proporcionais para cada backend. Por exemplo, utilizando-se 3 servidores backend, podemos utilizar os valores 33,3% (linha 8) e 33,3% (linha 9).

Uma vez que a variável $upstream_var (linha 7) foi inicializada, o seu valor é retornado para a variável $upstream_grp (linha 12), e o cookie "route" é enviado ao cliente com o valor desta variável (linha 23).

A partir deste momento, o cliente é direcionado para o upstream (linha 1) através da diretiva proxy_pass (linha 24), a variável $upstream_grp é então analisada pela diretiva hash[6] (linha 2), direcionando o acesso do cliente para o backend correspondente ao hash analisado.

Próximos acessos do cliente: utilizando o cookie "route" existente

Com o cookie "route" já armazenado no navegador, no acesso do cliente a variável $upstream_grp (linha 23) é inicializada logo na diretiva map (linha 12), sendo o valor do cookie "route" ($cookie_route) atribuído à variável $upstream_grp e o cliente direcionado para o upstream (linha 1) através da diretiva proxy_pass (linha 24), onde a variável $upstream_grp deverá ser analisada pela diretiva hash (linha 2) para que o acesso do cliente seja direcionado para o backend correspondente ao hash analisado.

Página anterior     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

2FA-Auth - Gerando Códigos de Autenticação 2FA no seu Terminal

openSUSE - Guia Básico Pós Instalação

Nuxeo EP com MySQL no Ubuntu LTS Server Hardy 8.04

Migração de Software Proprietário para Software Livre em Instituição Pública

Um tour pelos players de vídeo para Linux

  
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