Teste de Configuração do Nginx: Garantindo Implantações Suaves com Comandos Essenciais

Use nginx -t, nginx -T e hábitos seguros de recarga para detectar erros de configuração do Nginx antes que eles afetem o tráfego.

Teste de Configuração do Nginx: Garantindo Implantações Suaves com Comandos Essenciais

O teste de configuração do Nginx é um daqueles hábitos que parecem pequenos demais para importar até que te salvem de uma recarga quebrada. Um ponto e vírgula faltando, um caminho de include incorreto ou uma diretiva de um módulo que você não possui podem impedir o Nginx de aceitar uma nova configuração. Em um proxy reverso de produção, isso não é um erro pequeno.

O comando principal é simples:

sudo nginx -t

Execute-o antes de cada recarga. Execute-o após editar um bloco de servidor. Execute-o em CI se sua equipe armazena configurações do Nginx no Git. O comando analisa a configuração e informa se a sintaxe é válida. Ele não prova que sua lógica de roteamento está correta, que seu certificado TLS é válido para cada nome de host ou que seu aplicativo upstream está saudável. Ele captura a classe de erros que o Nginx pode detectar antes de aplicar a configuração.

O que nginx -t verifica

nginx -t instrui o Nginx a testar a configuração. Ele lê o arquivo de configuração principal, segue as diretivas include, analisa diretivas e blocos e verifica muitos problemas de arquivo/caminho. Uma execução bem-sucedida geralmente se parece com isto:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Uma execução com falha aponta para um arquivo e número de linha:

nginx: [emerg] unexpected "}" in /etc/nginx/conf.d/api.conf:18
nginx: configuration file /etc/nginx/nginx.conf test failed

O número da linha é onde o analisador notou o problema, nem sempre onde você cometeu o erro. Se o Nginx disser que um } inesperado aparece na linha 18, verifique as linhas acima em busca de um ponto e vírgula faltando ou um bloco não fechado.

Use sudo quando os arquivos de configuração, arquivos de certificado ou trechos incluídos forem legíveis apenas pelo root:

sudo nginx -t

Sem as permissões corretas, seu teste pode falhar mesmo que a sintaxe esteja correta.

Use nginx -T quando os includes tornarem a configuração difícil de visualizar

Muitas configurações do Nginx dividem a configuração entre /etc/nginx/nginx.conf, conf.d/*.conf, sites-enabled/* e trechos compartilhados. Isso é bom para a manutenibilidade, mas pode tornar a depuração confusa.

nginx -T testa a configuração e imprime a configuração completa analisada no stdout:

sudo nginx -T

Isso é útil quando você precisa responder perguntas como:

  • Qual arquivo realmente define este bloco de servidor?
  • Meu padrão include pegou um arquivo de backup?
  • Esta diretiva está sendo definida no escopo http, server ou location?
  • Qual bloco server_name duplicado está vencendo?

Tenha cuidado ao compartilhar a saída de nginx -T. Ela pode incluir caminhos de certificados, nomes de host internos, nomes de upstreams, cabeçalhos ou comentários com contexto sensível. Para um ticket, remova informações confidenciais antes de colar.

Teste um arquivo de configuração não padrão com -c

Se você estiver criando uma configuração em um caminho de staging, use -c:

sudo nginx -t -c /home/deploy/nginx-staging/nginx.conf

Isso informa ao Nginx qual arquivo de configuração principal testar. Caminhos relativos dentro dessa configuração podem se comportar de maneira diferente dependendo das configurações de prefixo, portanto, mantenha os testes de staging próximos ao layout de produção quando possível.

Você também pode inspecionar caminhos e módulos de tempo de compilação com:

nginx -V

A saída vai para o stderr em muitos sistemas, o que surpreende as pessoas ao redirecionar a saída. Mostra a versão do Nginx e as opções de compilação, incluindo suporte a módulos e caminhos padrão. Isso é importante quando uma configuração usa diretivas de módulos como http_v2, realip, stub_status ou proxy de stream.

Recarregue, não reinicie casualmente

Depois que o teste passar, recarregue o Nginx:

sudo systemctl reload nginx

Uma recarga pede ao processo mestre para ler a nova configuração e iniciar novos workers enquanto os workers antigos terminam as requisições existentes. Esse é o caminho normal para alterações de configuração.

Uma reinicialização para e inicia o serviço:

sudo systemctl restart nginx

Use a reinicialização quando realmente precisar, como após alterações de pacotes ou um problema de estado do serviço. Para edições de configuração comuns, a recarga é menos disruptiva.

Alguns arquivos de unidade do systemd executam um teste de configuração como parte da recarga. Não confie nisso como sua única rede de segurança. Execute nginx -t você mesmo primeiro para ver a falha antes de tocar no serviço em execução.

O comando de sinal nativo do Nginx também é comum:

sudo nginx -s reload

Em servidores gerenciados pelo systemd, geralmente prefiro systemctl reload nginx porque mantém o estado do serviço e os logs na mesma camada de gerenciamento.

Um fluxo de trabalho de edição seguro

Para uma alteração normal de bloco de servidor, use este ritmo:

sudo cp /etc/nginx/conf.d/api.conf /etc/nginx/conf.d/api.conf.bak.$(date +%Y%m%d%H%M%S)
sudoedit /etc/nginx/conf.d/api.conf
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx --no-pager

Se sua configuração estiver no Git, confirme a alteração em vez de manter arquivos de backup aleatórios para sempre. O comando de backup acima é útil para pequenos servidores não gerenciados, não um substituto para o controle de versão.

Após a recarga, teste a rota real:

curl -I https://example.com/api/health
curl -I -H 'Host: example.com' http://127.0.0.1/

nginx -t pode dizer que a configuração é analisada. curl diz se o site se comporta como você pretendia.

Mensagens de falha comuns e o que geralmente significam

Um ponto e vírgula faltando geralmente se parece com isto:

nginx: [emerg] invalid number of arguments in "proxy_set_header" directive in /etc/nginx/conf.d/app.conf:22

Verifique a diretiva nessa linha e na anterior. As diretivas do Nginx geralmente terminam com ;, enquanto os blocos terminam com { ... }.

Um caminho de include incorreto se parece com isto:

nginx: [emerg] open() "/etc/nginx/snippets/security-headers.conf" failed (2: No such file or directory)

Ou o caminho do arquivo está errado, o trecho não foi implantado ou o padrão de include é específico do ambiente.

Um problema de permissão pode se parecer com isto:

nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/example.com/fullchain.pem": BIO_new_file() failed

O arquivo pode estar faltando, o link simbólico pode estar quebrado ou o usuário que executa o teste não pode lê-lo. Scripts de renovação e implantação de certificados são lugares comuns para isso acontecer.

Uma diretiva desconhecida significa uma de três coisas: erro de digitação, contexto errado ou módulo faltando.

nginx: [emerg] unknown directive "proxy_cache_purge"

Talvez o nome da diretiva esteja errado. Talvez pertença a um módulo diferente. Talvez sua compilação de produção do Nginx não inclua o módulo de terceiros que existia no staging. Verifique nginx -V antes de assumir que a configuração é portátil.

Um nome de servidor duplicado ou conflitante pode aparecer como um aviso em vez de uma falha grave:

nginx: [warn] conflicting server name "example.com" on 0.0.0.0:80, ignored

Não ignore avisos só porque a linha final diz que o teste foi bem-sucedido. Um aviso pode significar que o Nginx não usará o bloco de servidor que você pensa que usará.

Testando em CI

Se a configuração do Nginx estiver em um repositório, teste-a antes da implantação. Uma verificação simples baseada em contêiner pode montar a configuração em uma imagem Nginx e executar:

nginx -t -c /etc/nginx/nginx.conf

A parte difícil é corresponder aos caminhos de produção. Se sua configuração faz referência a /etc/letsencrypt, os testes locais precisam de arquivos de espaço reservado ou uma configuração específica de teste. Se fizer referência a nomes de host upstream, o teste de sintaxe não precisa que o upstream esteja ativo, mas os arquivos incluídos e os arquivos de certificado devem existir.

Para equipes com muitos sites, adicione uma etapa de pré-implantação que execute nginx -T e armazene a saída sanitizada como um artefato. Quando uma recarga se comporta de forma estranha, você pode comparar a configuração renderizada da última boa implantação com a atual.

O que o teste de configuração não pode detectar

nginx -t não dirá que seu novo bloco location está sombreado por outra localização regex. Não saberá que seu aplicativo upstream retorna 500s. Não provará que uma cadeia de redirecionamento é sensata ou que uma regra de cache é segura.

Para isso, adicione verificações de comportamento:

curl -I https://example.com/
curl -I https://example.com/old-path
curl -sS https://example.com/api/health

Para alterações de TLS, verifique o certificado do ponto de vista do cliente:

openssl s_client -connect example.com:443 -servername example.com </dev/null

Para alterações de proxy reverso, monitore os logs durante e após a recarga:

sudo tail -f /var/log/nginx/error.log /var/log/nginx/access.log

O teste de configuração do Nginx não é uma estratégia de implantação completa, mas é o portão que toda estratégia deve incluir. Use nginx -t para sintaxe, nginx -T para depuração de configuração renderizada, nginx -V para detalhes de compilação e systemctl reload nginx para alterações normais. Em seguida, verifique o comportamento com requisições reais.