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 o seu pool upstream com todos os endereços retornados.

Crie o arquivo setup/nginx.conf:

nginx.conf
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /run/nginx.pid;


events {
    worker_connections  1024;
}

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.
(sem linha de algoritmo) Algoritmo de balanceamento de carga: nenhum é declarado, então o Nginx usa o padrão, Round Robin — cada nova requisição vai para a próxima réplica, em ordem.
proxy_pass Encaminha a requisição correspondente para o pool upstream.
X-Real-IP Repassa o endereço IP original do cliente para o serviço de backend.
X-Forwarded-For Acrescenta o IP do cliente à cadeia padrão de encaminhamento — 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; o arquivo acima não declara nenhum, então usa Round Robin. Para trocá-lo, adicione uma das linhas a seguir antes da entrada server:

Diretiva Algoritmo
(nenhuma) Round Robin (padrão)
least_conn; Least Connections
ip_hash; IP Hash (sessões fixas)
random; Random

O Weighted Round Robin usa o parâmetro 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 encontre todas as instâncias ao iniciar. Se réplicas forem adicionadas depois, o Nginx precisa ser recarregado para descobri-las:

docker compose exec lb nginx -s reload

A estrutura resultante do projeto, depois de adicionar o arquivo de configuração:

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