Tag: nginx

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