Objetivos Fundamentais
Arquiteturas monolíticas enfrentam limitações à medida que o tráfego de usuários aumenta, resultando em degradação de desempenho, maior latência de resposta e vulnerabilidade a falhas únicas. O balanceamento de carga visa distribuir requisições de clientes de maneira eficiente e uniforme entre múltiplos servidores, otimizando o desempenho global do sistema ao dividir a carga de trabalho.
Abordagens de Implementação
1. Balanceamento Baseado em DNS
Este método utiliza resolução de nomes de domínio para direcionar requisições para diferentes endereços IP. O servidor DNS pode alocar IPs de forma aleatória ou com base na proximidade geográfica, reduzindo a distância de rede e melhorando a eficiência. Embora simples e de baixo custo, o cache em múltiplos níveis do DNS pode atrasar atualizações de configuração, impactando a eficácia do balanceamento.
2. Balanceamento Baseado em Hardware
Dispositivos dedicados, semelhantes a switches de rede, são capazes de processar milhões de requisições por segundo. Eles suportam algoritmos avançados de balanceamento, incluem funcionalidades de segurança como firewall e são comercializados como soluções profissionais que minimizam a necessidade de manutenção por parte das empresas.
3. Balanceamento Baseado em Software
Ferramentas como Nginx, LVS e HAProxy são amplamente adotadas em ambientes corporativos devido à sua flexibilidade, natureza open sourrce e custo zero. Essas soluções oferecem alta adaptabilidade a diferentes cenários de tráfego.
Níveis de Operação
Camada 2 (Enlace de Dados)
Distribui requisições usando endereços MAC virtuais. Após receber uma solicitação, o sistema atribui dinamicamente um MAC real de um servidor backend para processar a resposta.
Camada 3 (Rede)
Baseia-se em endereços IP para direcionar tráfego. Clientes acessam um IP virtual, e o servidor balanceador redireciona a requisição para um IP real no cluster.
Camada 4 (Transporte)
Utiliza informações de destino como porta e endereço IP no cabeçalho de pacotes TCP/UDP para tomar decisões de roteamento. Soluções como Nginx, F5 e LVS suportam esse nível.
Camada 7 (Aplicação)
Analisa conteúdo da camada de aplicação, como cookies, headers HTTP ou corpo da mensagem, para direcionar requisições a servidores específicos, permitindo estratégias granulares de balanceamento.
Algoritmos Comuns de Balanceamento
Round Robin (Rodízio)
Distribui requisições de forma sequencial entre os servidores disponíveis, garantindo uma carga uniforme ao longo do tempo.
Aleatório
Emprega um gerador de números aleatórios para selecionar o servidor de destino, o que pode levar a variações na distribuição da carga.
Hash Consistente
Aplica uma função de hash a características da requisição (como IP do cliente ou URL) para mapear sempre ao mesmo servidor, útil para manter sessões ou estado local.
Mínimo de Conexões
Direciona a requisição ao servidor com o menor número de conexões ativas no momento, buscando equilibrar a carga em tempo real.
Nginx: Visão Geral e Configuração
Nginx é um servidor HTTP de alta performance e proxy reverso, conhecido por seu baixo consumo de memória e capacidade de lidar com grande concorrência. Ele suporta estratégias de balanceamento integradas, como round robin, round robin ponderado e IP hash, além de extensões através de módulos.
Exemplo de Configuração de Balanceamento
O bloco upstream define um grupo de servidores backend. O parâmetro weight influencia a proporção de requisições direcionadas a cada servidor. O bloco server configura o Nginx para escutar em uma porta e encaminhar requisições para o grupo definido via proxy_pass.
upstream servidores_web {
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080 weight=1;
}
server {
listen 8080;
server_name exemplo.com.br;
location / {
proxy_pass http://servidores_web;
proxy_set_header Host $host;
}
}
Conceitos de Proxy
Proxy Direto
Atua intermediando requisições de clientes para servidores externos. O cliente conhece o proxy e configura explicitamente seu uso. Funcionalidades incluem acesso controlado, cache de conteúdo, anonimato e filtragem de dados.
Proxy Reverso
Intermedia requisições de clientes para servidores internos, ocultando a infraestrutura backend. Benefícios incluem balanceamento de carga, segurança aprimorada (escondendo IPs internos), término de conexões SSL/TLS e caching de conteúdo estático.
Diferenças Principais
O proxy direto serve aos clientes, facilitando o acesso a recursos externos. O proxy reverso serve aos servidores, protegendo e otimizando recursos internos, sendo transparente para os clientes finais.
Tópicos Avançados sobre Nginx
Concorrência Elevada
Nginx alcança alto desempenho através de um modelo baseado em eventos (usando epoll ou kqueue), mecanismos assíncronos não bloqueantes, reutilização de conexões (keep-alive), gerenciamento eficiente de memória com pools pré-alocados, design modular e otimização de conteúdo estático via cache e compressão.
Casos de Uso
Serve como servidor de arquivos estáticos, proxy reverso, balanceador de carga, cache HTTP, terminador SSL/TLS, proxy para aplicações em containers, gateway de API, e ferramenta para proteção contra tráfego malicioso.
Processamento de Conteúdo
Nginx entrega diretamente recursos estáticos (HTML, CSS, imagens). Para conteúdo dinâmico, atua como proxy reverso, encaminhando requisições a backends como Tomcat ou servidores de aplicação especializados.
Diretiva location
Define como o Nginx responde a URLs específicas. Padrões de correspondência podem ser usados para aplicar configurações distintas, como regras de proxy, redirecionamentos ou servir arquivos diferentes.
Estrutura de Arquivo de Configuração
O arquivo principal (nginx.conf) contém blocos events (parâmetros de conexão), http (configurações de servidor, proxy, MIME types, logs) e opcionalmente mail (para proxy de email).
Habilitação de HTTPS
Configurar HTTPS envolve adicionar um bloco server que escuta na porta 443 com as diretivas ssl_certificate e ssl_certificate_key. Geralmente, redireciona-se tráfego da porta 80 (HTTP) para 443 usando um código de status 301. Protocolos como TLSv1.2/1.3 e cifras seguras são especificados para reforçar a segurança.
server {
listen 80;
server_name meudominio.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name meudominio.com;
ssl_certificate /caminho/para/certificado.pem;
ssl_certificate_key /caminho/para/chave.pem;
ssl_protocols TLSv1.2 TLSv1.3;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Processamento de Requisições
Utilizando um modelo multiprocessado com um processo master e múltiplos workers, o Nginx recebe requisições no master e as distribui para workers que executam o tratamento efetivo usando I/O não bloqueante.
Implementação de Lista Negra de IPs
Bloqueios podem ser aplicados usando as diretivas deny e allow dentro de blocos server ou location. Alternativas incluem regras de firewall (iptables), configurações em outros servidores web ou gerenciamento via código/aplicação.
Proteção contra Ataques DDoS
Módulos como limit_req e limit_conn permitem controlar taxa e número de conexões. Combinações com ferramentas como fail2ban ou regras de firewall adicionam camadas de defesa contra tráfego aômalo.
Comparação com Apache
Nginx se destaca em cenários de alta concorrência, consumo eficiente de memória e como proxy reverso. Apache oferece uma vasta gama de módulos e suporte flexível a configurações por diretório (.htaccess), sendo mais indicado para ambientes que dependem extensivamente de módulos dinâmicos.