Como configurar o Nginx Unit

Nos últimos dias, mergulhei no NGINX Unit, um servidor da própria equipe do NGINX projetado para substituir o combo tradicional “NGINX + Gunicorn + uWSGI”.
A promessa é boa: configuração dinâmica via API, múltiplos apps (Python, PHP, Go, etc.) no mesmo processo, e até proxy reverso para outros containers.

Mas ,na prática, o Unit pode ser cheio de pegadinhas.

Segue um resumo do que aprendi — com erros, acertos e código real.

O que é o Nginx UNIT

O NGINX Unit é um servidor de aplicações modular, criado pela equipe do NGINX, mas com uma filosofia diferente:

  • Ele não usa arquivos de configuração no formato nginx.conf.
  • Toda a configuração é feita via API HTTP (ou socket Unix).
  • E ela é atualizável em tempo real, sem reiniciar o serviço.

Você pode, por exemplo, adicionar um novo site, trocar a linguagem de execução ou criar um proxy reverso apenas enviando um POST JSON.

Subindo o Unit com Docker

O compose para o container do Unit segue o seguinte yaml:

services:

unit:
image: nginx/unit:1.32.1
ports:
- "8080:80"
volumes:
- ./config:/docker-entrypoint.d
- ./sites:/var/www/sites

Para aplicar uma configuração use o comando:

curl -X PUT --data-binary @config.json http://localhost:8080/config
# Substituta o localhost:8080 pelo endereço do seu ambiente

Configurando sites estáticos

Para configurar um site que server apenas conteúdo estático o JSON pode ser usado:

{
    "listeners": {
    "*:80": {
       "pass": "routes/main"
    }
},
    "routes": {
        "main": [
            {
                 "match": {
                 "host": "site1.example.com"
            },
        "action": {
            "share": "/var/www/sites/site1"
        }
      }
     ]
    }
}

Dica: o caminho (share) precisa existir dentro do container, então monte seu volume corretamente no docker-compose.yml.

Configurando um proxy

O Unit não entende o nome dos containers (ex: app:8000), porque ele não usa o DNS interno do Docker.

Você precisa usar um IP fixo (i.e. o IP da aplicação configurado no compose) ou um alias adicionado via extra_hosts.

O JSON que deve ser aplicado ao Unit tem estrutura semelhante, exceto pela parte a seguir:

"routes": {
    "main": [
        {
            "match": { "host":    "deployer.linkei.app.br" 
        },
     "action": {
          "proxy": "http://172.28.0.11:8000",
           "rewrite": "$uri"
      }
    }
  ]
}

💡 Importante: o campo “rewrite” deve ser uma string, não um objeto. Muita gente erra isso (inclusive eu, no começo).

Debugando erros comuns

Segue uma tabela com erros comuns e algumas soluções que apliquei.

ERROCAUSASOLUÇÃO
403 ForbiddenO Unit não tem permissão para ler o diretório shareAjuste permissões (chmod -R a+rX /var/www/sites)
Request "pass" points to invalid locationErro de referência no campo "pass"Use "pass": "routes/main", não "routes/main/"
connection resetUnit não consegue alcançar o container backendUse IP fixo ou extra_hosts
types value must be string or arrayJSON incorreto ao definir MIME typesUse "types": ["text/html", "text/css", ...]

Conclusão

O NGINX Unit é uma ferramenta poderosa — mas diferente.
Ele exige um pouco de experimentação e leitura da documentação oficial, especialmente porque pequenos detalhes de JSON podem causar grandes dores de cabeça.

Mas, uma vez entendido, ele te dá uma flexibilidade incrível:
você pode subir e atualizar sites estáticos, APIs e apps em tempo real, via API, sem reiniciar nada.

Ideal para quem está construindo plataformas de deploy automatizado.

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *