📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Cap. 09 (Nginx) do Guia de Redes. Recomendado revisar antes de começar.

🚀 Nginx com Balanceamento de Carga e Proxy Reverso

v1.0 — Nginx, Load Balancing Round-Robin, Reverse Proxy e Docker Compose

Trilha de Especialização Pedagógica — Projeto 1 de 5

🎓 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.


🎯 Objetivo & Escopo do Projeto

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.


🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Líder de Infraestrutura & Cloud)

“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.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

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

📋 Fase 2 — Backlog & User Stories

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

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Deploy)

# 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

🛠️ Fase 4 — Implementação Guiada (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;
        }
    }
}


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd infra_nginx_01_nodejs

2. Execute a aplicação ou testes

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`

🧭 Decisões de Arquitetura (ADRs)


🧪 Testes de Validação & Carga

# 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


🏛️ Arquitetura Visual & Engenharia de Infraestrutura

O diagrama abaixo ilustra a topologia de componentes, balanceamento, esteiras de automação e observabilidade na subpasta nginx/:

Arquitetura de Infraestrutura

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

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

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

⚙️ Requisitos Funcionais (RF)

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

🛡️ Requisitos Não-Funcionais (RNF)

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

🔗 Matriz de Rastreabilidade (RTM)

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

🏁 Checkpoints de Qualidade & Homologação

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 ✅