Pular para conteúdo

b. Nginx

O Nginx é configurado como um proxy reverso HTTP usando um bloco upstream que define o pool de servidores de backend. Quando o Docker Compose sobe várias réplicas do serviço gateway, o DNS interno do Docker resolve o nome de serviço gateway para os endereços IP de todas as réplicas. O Nginx consulta esse registro DNS na inicialização e monta seu pool upstream com todos os endereços retornados.

Crie o arquivo setup/nginx/nginx.conf:

nginx.conf
http {

    upstream gateways {
        server gateway:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass         http://gateways;
            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-Forwarded-Proto $scheme;
        }
    }
}

Diretivas principais:

Diretiva Finalidade
upstream gateways Dá nome a um pool de servidores de backend. O DNS do Docker expande gateway:8080 para os IPs de todas as réplicas na inicialização.
least_conn Algoritmo de balanceamento de carga: cada nova requisição vai para a réplica com menos conexões ativas.
proxy_pass Encaminha a requisição correspondente para o pool upstream.
X-Real-IP Repassa o endereço IP original do cliente ao serviço de backend.
X-Forwarded-For Acrescenta o IP do cliente à cadeia de encaminhamento padrão — usado em logs e trilhas de auditoria.
X-Forwarded-Proto Informa ao backend se a requisição original chegou via HTTP ou HTTPS.

Trocando o algoritmo

O algoritmo é declarado dentro do bloco upstream. Substitua least_conn por qualquer uma das opções a seguir:

Diretiva Algoritmo
(nenhuma) Round Robin (padrão)
least_conn; Least Connections
ip_hash; IP Hash (sticky sessions)
random; Random

O Weighted Round Robin usa parâmetros weight por servidor: server gateway:8080 weight=3;

Resolução de DNS e escalonamento dinâmico

O Nginx resolve o hostname gateway uma única vez na inicialização e guarda em cache a lista de IPs retornada. Subir a stack com um número fixo de réplicas (definido no compose.yaml) garante que o Nginx reconheça todas as instâncias ao iniciar. Se réplicas forem adicionadas depois, o Nginx precisa ser recarregado para descobri-las:

docker compose exec nginx nginx -s reload

A estrutura do projeto resultante após adicionar o arquivo de configuração:

📁 api/
├── 📁 setup/
│   └── 📁 nginx/
│       └──  nginx.conf
├── 📁 account-service/
├── 📁 auth-service/
├── 📁 gateway-service/
├── YAML compose.yaml
└──  .env