Se você já tentou escalar uma aplicação web e viu o servidor travar com poucas centenas de usuários simultâneos, provavelmente estava usando uma configuração padrão que não foi pensada para isso. Esse é o problema que o Nginx resolve — e resolve bem.
Neste artigo, a primeira parte de uma série de três, vamos entender o que é o Nginx, como ele funciona por dentro e por que ele se tornou o servidor web mais usado em aplicações de alto tráfego.
O problema com o modelo tradicional
Servidores como o Apache foram construídos num modelo chamado prefork ou thread-per-request: para cada requisição recebida, o servidor cria (ou aloca) uma thread ou processo dedicado. Isso é simples de implementar, mas escala mal.
Com 1.000 conexões simultâneas, você tem 1.000 threads na memória. Com 10.000, a situação começa a ficar crítica. Memória esgotada, trocas de contexto excessivas, latência aumentando. Esse fenômeno é conhecido como o problema C10k — como servir 10.000 clientes ao mesmo tempo com um único servidor.
A arquitetura orientada a eventos do Nginx
O Nginx foi criado em 2004 por Igor Sysoev com esse problema em mente. Em vez de criar uma thread por conexão, ele usa uma arquitetura baseada em eventos (event-driven).
O funcionamento é assim:
- Um processo master lê a configuração e gerencia os workers
- Múltiplos worker processes ficam em execução, geralmente um por núcleo de CPU
- Cada worker usa um loop de eventos para monitorar e processar centenas ou milhares de conexões de forma não-bloqueante
Quando uma conexão está aguardando dados (por exemplo, o cliente está lendo uma resposta lenta), o worker não fica parado esperando — ele processa outras conexões enquanto isso. Nenhum recurso é desperdiçado.
┌─────────────────────────────┐
│ Master Process │
│ (lê config, gerencia PID) │
└────────────┬────────────────┘
│
┌──────────────────┼──────────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Worker 1 │ │ Worker 2 │ │ Worker N │
│ (event │ │ (event │ │ (event │
│ loop) │ │ loop) │ │ loop) │
└──────────┘ └──────────┘ └──────────┘
O que o Nginx sabe fazer
O Nginx não é só um servidor web. Ele atua em várias camadas de uma infraestrutura moderna:
Servidor web para conteúdo estático
Servir HTML, CSS, JavaScript, imagens e fontes diretamente do disco com altíssima eficiência. Nenhum backend é acionado.
Reverse proxy
Recebe requisições do cliente e as repassa para um ou mais servidores de aplicação (Node.js, Python, Go, PHP). O cliente nunca fala diretamente com o backend.
Load balancer
Distribui requisições entre múltiplos backends usando diferentes estratégias: round-robin, least connections, IP hash e outras.
Cache de respostas
Armazena respostas do backend em disco ou memória. Requisições repetidas são respondidas pelo Nginx sem chegar ao servidor de aplicação.
Terminação SSL/TLS
Gerencia os certificados e criptografia, entregando as requisições já descriptografadas ao backend via HTTP simples.
Compressão gzip
Comprime respostas antes de enviá-las ao cliente, reduzindo o tráfego de rede em até 70% para texto, CSS e JavaScript.
Comparativo: Apache vs Nginx
| Característica | Apache | Nginx |
|---|---|---|
| Modelo de concorrência | Thread/processo por requisição | Event-driven, assíncrono |
| Uso de memória com alto tráfego | Alto | Baixo |
| Conteúdo estático | Bom | Excelente |
| Configuração por diretório (.htaccess) | Sim | Não (centralizada) |
| Módulos dinâmicos | Sim | Sim (desde v1.9.11) |
| Ideal para | Apps legadas, configurações complexas por diretório | Alta concorrência, reverse proxy, microserviços |
Nenhum dos dois é "melhor" em absoluto — mas para aplicações novas com requisitos de escala, o Nginx é a escolha mais comum.
Como o Nginx processa uma requisição
O ciclo de vida de uma requisição no Nginx passa por fases bem definidas:
- Aceita a conexão TCP — o worker recebe a conexão pelo event loop
- Lê o request HTTP — cabeçalhos e corpo da requisição
- Avalia as diretivas — verifica
server_name, blocoslocation, regras de cache - Executa a ação — serve arquivo estático, faz proxy para backend, retorna redirect, etc.
- Envia a resposta — com compressão e headers adequados
- Registra nos logs — acesso e erros em arquivos separados
Esse fluxo acontece para milhares de conexões em paralelo, dentro do mesmo processo, sem bloqueio.
Quando usar Nginx
O Nginx é uma boa escolha quando você precisa de:
- Servidor para sites ou SPAs com conteúdo predominantemente estático
- Reverse proxy na frente de aplicações Node.js, Python (Django/FastAPI), Go ou PHP-FPM
- Load balancer para múltiplas instâncias da mesma aplicação
- Gateway único para microsserviços, centralizando SSL, logs e rate limiting
- Cache de respostas para reduzir carga no backend
Próximo artigo
Na parte 2 desta série, saímos da teoria e configuramos um servidor Nginx do zero: instalação, estrutura de diretórios, arquivo de configuração versionado no repositório e todos os comandos necessários para deixar o servidor respondendo em produção.
Referências: