Nginx: Balanceamento de Carga em Aplicações Web

Como o próprio site do projeto o define:

“O Nginx (Pronuncia correta: Engine X) é um HTTP e um servidor proxy reverso, um servidor proxy de email e um servidor proxy genérico TCP/UDP, escrito originalmente por Igor Sysoev. Por um longo tempo, ele foi executado em muitos sites russos fortemente carregados, incluindo Yandex, Mail.Ru, VK, e Rambler. De acordo com a Netcraft, o nginx como servidor ou proxy esteve presente em 27,90% dos sites mais movimentados em julho de 2016. Aqui estão algumas das histórias de sucesso:

  • Netflix
  • WordPress.com
  • FastMail.FM

1. Introdução ao Nginx

A grosso modo, basicamente o Nginx é o atual concorrente do Apache, sendo um servidor web (http) com demais funcionalidades. O que fazem com que ambos sejam semelhantes, mas tendo cada um sua particularidade, além de cada um ter seu grandioso e respeito espaço no mercado.

O Nginx se tornou popular por ser fácil de configurar e ter um response time significativo. Mas é válido dizer que de forma alguma estou aqui para afirmar que ele é melhor que o Apache, já que respeito muito ambos os projetos.

Neste post iremos esclarecer como configurar o Nginx como Balanceador de Carga para aplicações HTTP, configurando o mesmo para balancear requisições HTTP entre dois nodes (nós).

Caso tenha dúvida sobre como funciona Balanceamento de Carga o conceito pode ser mais esclarecido no respectivo link: http://www.linuxsysadmin.com.br/index.php/2015/08/06/alta-disponibilidade-o-conceito/

2. Instalando o Nginx

Primeiramente vamos instalar e configurar o repositório oficial do Nginx e em seguida instalar o pacote nginx.

Lembrando que damos sempre preferência ao repositório oficial, já que o mesmo possui versões do pacote muito mais atualizada que os pacotes disponibilizados nos repositórios das distribuições.


No CentOS, execute os passos:

# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
:x!
# yum install nginx


No Debian, execute os passos:

# vim /etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/debian/ jessie nginx
deb-src http://nginx.org/packages/debian/ jessie nginx
:X!
# wget http://nginx.org/keys/nginx_signing.key -O /tmp/nginx_signing.key
# apt-key add /tmp/nginx_signing.key
# apt-get update
# apt-get install nginx

3. Configurando o Load balancer

Feita a instalação do Nginx, precisamos configurar o balanceamento de carga no ambiente da seguinte forma:


No CentOS e Debian, execute os passos:

# vim /etc/nginx/conf.d/balancer.conf
# Pool do Load balancer
upstream pool.linuxsysadmin.com.br {
        server 192.168.50.3;
        server 192.168.50.4;
}
 
# Setando as variáveis do cabeçalho HTTP.
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Queue-Start “t=${msec}000”;
 
# Proxy Pass do balanceador
server {
    listen       80;
    server_name  localhost;
 
        location / {
                proxy_pass http://pool.linuxsysadmin.com.br;
        }
}

A diretiva “upstream” aponta o Virtual Host a ser utilizado pelo Balanceador de Carga, dentro os parâmetros “server” indicam os servidores de backend, ou seja, será o nodes utilizados utilizados no cluster.

Abaixo possui os parâmetros proxy_set_header, eles tem a finalidade de trocar os campos do cabeçalho HTTP por variáveis. Mais informações sobre os campos do cabeçalho HTTP podem ser obtidas em https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

E por último a diretiva “server” faz o proxy pass, declarando que o contexto raiz “/” será direcionado para o Virtual Host do Balanceador de Carga.

Feito o procedimento acima, podemos adicionar o nginx no boot do sistema operacional e reiniciar o serviço do Nginx.


No CentOS e Debian, execute os passos:

# systemctl enable nginx
# systemctl restart nginx

Obs: É importante que as máquinas 192.168.50.3 e 192.168.50.4 já esteja no ar e configuradas. No caso eu recomendaria instalar o apache em ambas as maquinas e criar um index.html dentro de /var/www e/ou /var/www/html dependendo da distribuição utilizada. Outro ponto a considerar é que estes endereços podem ser trocados de IP para nome, como por exemplo app01.linuxsysadmin.com.br, app02.linuxysadmin.com.br, etc. Porém é importante que o balanceador de carga esteja resolvendo o nome adequadamente.

4. Validando o Balanceamento de Carga

Edite o seu /etc/hosts e adicione a entrada:

:

# echo -e "IPDOSERVIDORNGINX\tpool.linuxsysadmin.com.br" > /etc/hosts

Abra o seu navegador e acesse http://pool.linuxsysadmin.com.br:

5. Métodos de Balanceamento de Carga

O Nginx possui três métodos de balanceamento de carga suportados, sendo eles:

  1. round-robin — As requisições são distribuídas igualmente entre os servidores.
  2. least-connected — O próximo pedido é sempre atribuído ao servidor com o menor número de conexões ativas.
  3. ip-hash — A função ip_hash é usada para determinar qual servidor deve ser selecionado para o próximo pedido (com base no endereço IP do cliente), tendo uma sessão persistente.

Muitas vezes é visto administradores recomendando desenvolvedores a modificar a aplicação para fazer uso de Memcache ou Redis para manter a sessão entre os nós do cluster, entre outros modelos.
De repente estes modelos apresentados acima podem lhe atender bem, sem necessidade de modificações extras no cenário.

Estes métodos devem ser adotados de acordo com o melhor modelo para sua aplicação.

6. Round Robin

Round Robin é o modelo de balanceamento de carga padrão adotado pelo Nginx. Caso o método não seja especificado ele sempre assume o método Round Robin. No caso, o modelo que estamos usando neste cenário é o método Round Robin.

Note no navegador que conforme é feito o refresh da página ora ele acesse 192.168.50.3 ora aparece 192.168.50.4, porque ele sempre vai distribuir a requisição igualmente entre cada nó.

7. Least Connected

O Least Connected como informado acima direciona a próxima requisição sempre para o nó com o menor número de conexões.

Para configurar o seu balanceamento de carga com este método, basta adicionar o parâmetro “least_conn” dentro da diretiva upstream. Por exemplo:


No CentOS e Debian, execute os passos:

# vim /etc/nginx/conf.d/balancer.conf
(...)
upstream pool.linuxsysadmin.com.br {
        least_conn;
        server 192.168.50.3;
        server 192.168.50.4;
}
(...)

Reinicie o serviço do Nginx para aplicar a mudança.


No CentOS e Debian, execute os passos:

# systemctl restart nginx

Para validar este método, abra seu navegador e acesse pool.linuxsysadmin.com.br e faça um refresh da página para entender de forma prática como ele aplica este modelo.

8. IP Hash

O IP Hash como dito acima direciona a requisição sempre sempre para o mesmo nó, baseado no IP de origem. Ou seja, se a estação 192.168.50.10 acessar o balanceador pelo navegador, supondo que o nginx jogou essa requisição para o primeiro nó, ele sempre vai direcionar a requisição deste cliente para o primeiro nó.
Para configurar o seu balanceamento de carga com este método, basta adicionar o parâmetro “ip_hash” dentro da diretiva upstream. Por exemplo:


No CentOS e Debian, execute os passos:

# vim /etc/nginx/conf.d/balancer.conf
(...)
upstream pool.linuxsysadmin.com.br {
        ip_hash;
        server 192.168.50.3;
        server 192.168.50.4;
}
(...)

Reinicie o serviço do Nginx para aplicar a mudança.


No CentOS e Debian, execute os passos:

# systemctl restart nginx

Para validar este método, abra seu navegador e acesse pool.linuxsysadmin.com.br e faça um refresh da página para entender de forma prática como ele aplica este modelo. Note que ele a requisição sempre é enviada para o mesmo nó.

9. Conclusão

O Balanceamento de Carga do Nginx como visto é muito simples de se configurar. Além disso, o Nginx vem crescendo cada vez mais, cada dia ganhando mais e mais espaço no mercado, sendo adotado por diversas empresas e nos mais variados ambientes.

Por isso espero que este post lhe seja útil e que te ajude a compreender de forma fácil como funciona o balanceamento de carga de aplicações web.

Mais informações sobre o Nginx podem ser obtidas diretamente em sua documentação oficial: https://nginx.org/en/docs/