📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Cap. 09 (Nginx) do Guia de Redes. Recomendado revisar antes de começar.
v1.0 — Nginx, Load Balancing Round-Robin, Reverse Proxy e Docker Compose
Trilha de Especialização Pedagógica — Projeto 1 de 5
- ➡️ v1 (este): Nginx Load Balancer · Proxy Reverso · Algoritmo Round-Robin · Docker Compose
- v2: Load Balancing com Backend Java Spring Boot
- v3: Testes de Carga Visual com Gatling & Grafana
- v4: Orquestração de Contêineres com Kubernetes (K8s)
- v5: Infraestrutura como Código (IaC) com Terraform & AWS
🎓 Nível Profissional Simulado: Engenheiro DevOps Júnior / SRE Trainee. Nenhuma grande aplicação roda em um único servidor. Engenheiros de infraestrutura projetam sistemas com Proxy Reverso e Balanceadores de Carga, garantindo que, se um nó cair, o tráfego seja redirecionado instantaneamente sem que o usuário perceba.
Configurar e executar um ambiente de Alta Disponibilidade com Nginx atuando como Proxy Reverso e Balanceador de Carga no algoritmo Round-Robin, distribuindo requisições HTTP entre múltiplos contêineres de backend isolados via Docker Compose.
“Nosso servidor web atual cai sempre que recebe mais de 500 acessos simultâneos. Precisamos criar um cluster com 3 instâncias da nossa aplicação rodando em contêineres e um Nginx na frente distribuindo o tráfego de forma alternada (Round-Robin). Se uma das instâncias for desligada, o Nginx deve parar de mandar requisições para ela imediatamente.”
| ID | Tipo | Descrição | Origem no Briefing |
|---|---|---|---|
| RF01 | Funcional | Configurar bloco upstream no Nginx apontando para as instâncias de backend. |
“3 instâncias da aplicação” |
| RF02 | Funcional | Distribuir requisições no padrão Round-Robin alternando entre os nós. | “distribuindo de forma alternada” |
| RF03 | Funcional | Subir o cluster completo com um único comando via docker-compose up. |
“rodando em contêineres” |
| RNF01 | Não-Funcional | Latência adicional de proxy inferior a 1 milissegundo. | Performance de Rede |
| RNF02 | Não-Funcional | Isolamento de rede em bridge interna do Docker. | Segurança de Infra |
| ID | User Story | Prioridade |
|---|---|---|
| US01 | Como usuário, quero acessar a URL principal e ser atendido por um dos nós ativos do cluster. | Alta |
| US02 | Como SRE, quero escalar instâncias de backend horizontalmente alterando apenas o arquivo de configuração. | Alta |
# Branch da funcionalidade
git checkout -b feature/US01-nginx-loadbalancer
# Subir o cluster completo
docker-compose up -d
# Visualizar a distribuição de requisições nos logs
docker-compose logs -f nginx
nginx.conf)events { worker_connections 1024; }
http {
upstream backend_cluster {
server app_node_1:3000;
server app_node_2:3000;
server app_node_3:3000;
}
server {
listen 80;
location / {
proxy_pass http://backend_cluster;
proxy_set_header Host $host; proxy_set_header X-Real-IP$remote_addr;
}
}
}
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd infra_nginx_01_nodejs
terraform init && terraform plan
# ou docker-compose up -d
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/infra_nginx_01_nodejs`
# Enviar 6 requisições consecutivas para validar alternância de nós (1 -> 2 -> 3 -> 1 -> 2 -> 3)
for i in {1..6}; do curl -s http://localhost:8080/api/status; echo ""; done
O diagrama abaixo ilustra a topologia de componentes, balanceamento, esteiras de automação e observabilidade na subpasta nginx/:
flowchart TD
subgraph Config["Configuração & IaC"]
C1["Manifestos Declarativos"] --> C2["Variáveis & Segredos"]
end
subgraph Orquestracao["Orquestração & Redes"]
O1["Load Balancer / Ingress"] --> O2["Pods / Contêineres de Serviço"]
end
subgraph Observabilidade["Observabilidade & Segurança"]
M1["Telemetria Prometheus / k6"] --> M2["Scanners SAST & Dashboards"]
end
subgraph Qualidade["Homologação & Qualidade"]
Q1["Automação CI/CD"] --> Q2["Checkpoints CP-01..05 PASS"]
end
Config --> Orquestracao
Orquestracao --> Observabilidade
Observabilidade --> Qualidade
style Config fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
style Orquestracao fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
style Observabilidade fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
style Qualidade fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px
| ID | Persona | História de Usuário | Critério de Aceite | Prioridade |
|---|---|---|---|---|
| US-01 | Engenheiro SRE | Desejo balanceador Nginx distribuindo requisições em Round-Robin | Alternância uniforme de tráfego HTTP entre múltiplos nós de aplicação | Alta |
| US-02 | Desenvolvedor Backend | Desejo receber o IP real do cliente através do cabeçalho X-Real-IP | Encaminhamento correto de headers de proxy reverso sem perda de telemetria | Alta |
| US-03 | Analista de Infraestrutura | Desejo failover automático quando um dos nós ficar indisponível | Nginx detectando nós caídos (max_fails / fail_timeout) e re-roteando tráfego | Alta |
| US-04 | Operador de Deploy | Desejo subir todo o cluster conteinerizado com docker-compose up | Ambiente com Nginx e 3 réplicas Node.js isoladas em bridge interna | Média |
| US-05 | Auditor de Carga | Desejo script de testes enviando rajadas para validar distribuição | Script de teste de carga validando que cada réplica atende proporcionalmente | Média |
| ID | Descrição do Requisito | Criticidade |
|---|---|---|
| RF-01 | Bloco upstream no Nginx com estratégia Round-Robin e 3 nós de backend | Alta |
| RF-02 | Configuração de proxy_set_header (Host, X-Real-IP, X-Forwarded-For) | Alta |
| RF-03 | Configuração de health checks passivos com parâmetros max_fails e fail_timeout | Alta |
| RF-04 | Visualizador e dashboard de distribuição de nós integrado | Média |
| RF-05 | Scripts de carga e testes automatizados de failover | Média |
| ID | Especificação Arquitetural | Criticidade |
|---|---|---|
| RNF-01 | Latência adicional introduzida pelo proxy reverso inferior a 1ms | Alta |
| RNF-02 | Isolamento estrito de portas dos backends fechadas para o mundo externo | Alta |
| RNF-03 | Configuração Nginx compatível com versões estáveis 1.25+ | Média |
| RNF-04 | Reprodutibilidade completa via Docker Compose | Alta |
| RNF-05 | Isolamento dos arquivos de configuração na pasta nginx/ | Alta |
| User Story | Requisito Funcional | Requisito Não-Funcional | Módulo / Artefato de Código | Status de Homologação |
|---|---|---|---|---|
| US-01 | RF-01 |
RNF-01, RNF-03 |
nginx/nginx.conf |
Testado |
| US-02 | RF-02 |
RNF-01, RNF-02 |
nginx/nginx.conf |
Testado |
| US-03 | RF-03 |
RNF-01, RNF-03 |
nginx/nginx.conf |
Testado |
| US-04 | RF-04 |
RNF-02, RNF-04 |
docker-compose.yml |
Testado |
| US-05 | RF-05 |
RNF-01, RNF-05 |
tests/load-test.js |
Testado |
| Checkpoint | Escopo da Validação | Artefato Verificado | Status |
|---|---|---|---|
| CP-01 | Configuração Declarativa do Ambiente | nginx/ |
PASS ✅ |
| CP-02 | Provisionamento & Orquestração | Deployments / Services |
PASS ✅ |
| CP-03 | Redes, Proxies & Segurança de Borda | Ingress / Security Groups |
PASS ✅ |
| CP-04 | Observabilidade, Métricas & SAST | Metrics / Scanners |
PASS ✅ |
| CP-05 | Homologação com Suíte de Testes | Test Suite / CI Gate |
PASS ✅ |