Solução de Problemas no Nginx: Soluções Comuns de Linha de Comando para Problemas de Servidor Web

Use verificações práticas de linha de comando do Nginx para status do serviço, erros de configuração, logs, portas e falhas comuns 4xx ou 5xx.

Solução de Problemas no Nginx: Soluções Comuns de Linha de Comando para Problemas de Servidor Web

Quando o Nginx quebra, os primeiros minutos geralmente são para restringir o problema. O serviço parou? Uma alteração de configuração falhou? Outro processo já está usando a porta 80? O Nginx está saudável, mas o aplicativo upstream está inativo? A linha de comando fornece respostas rápidas se você executar as verificações na ordem correta.

Gosto de começar com os comandos menos destrutivos: inspecionar status, testar configuração, ler logs e só então recarregar ou reiniciar. Uma reinicialização pode ocultar evidências úteis, portanto, trate-a como uma correção somente depois de saber o que está corrigindo.

Comandos Essenciais de Gerenciamento do Nginx

O primeiro passo na solução de problemas geralmente é verificar o estado do próprio serviço Nginx. Dependendo do seu sistema operacional, você normalmente interagirá com systemd ou service (SysVinit).

1. Verificando o Status do Serviço Nginx

Saber se o Nginx está em execução, parado ou falhando é crucial. O comando status fornece essa visão geral.

Usando systemd (Comum em distribuições Linux modernas como Ubuntu 16.04+, CentOS 7+):

sudo systemctl status nginx

Saída Esperada (Ativo/Em Execução):

● nginx.service - Um servidor web de alto desempenho e um servidor proxy reverso
   Carregado: carregado (/lib/systemd/system/nginx.service; habilitado; predefinição do fornecedor: habilitado)
   Ativo: ativo (em execução) desde Ter 2023-10-24 10:00:00 UTC; há 1 hora
     Docs: man:nginx(8)
 PID Principal: 1234 (nginx)
    Tarefas: 2 (limite: 4915)
   CGroup: /system.slice/nginx.service
           ├─1234 nginx: processo mestre /usr/sbin/nginx -g daemon on;
           └─1235 nginx: processo trabalhador

Se a saída mostrar Ativo: inativo (morto) ou Ativo: falhou, você sabe que o Nginx não está servindo tráfego no momento. Isso não diz o porquê. A próxima pista geralmente é um teste de configuração ou o diário do sistema.

sudo journalctl -u nginx -n 80 --no-pager

Isso mostra logs de serviço recentes, incluindo falhas de inicialização do systemd. Procure por mensagens sobre diretivas desconhecidas, arquivos de certificado ausentes, falhas de bind ou erros de permissão.

2. Iniciando, Parando e Recarregando o Nginx

Depois de identificar o estado, você precisa gerenciá-lo. Use os seguintes comandos conforme necessário:

Ação Comando (usando systemctl)
Parar Serviço sudo systemctl stop nginx
Iniciar Serviço sudo systemctl start nginx
Reiniciar Serviço sudo systemctl restart nginx (Para e depois inicia novamente)
Recarregar Configuração sudo systemctl reload nginx (Aplica novas configurações sem interromper conexões)

Melhor Prática: Use reload em vez de restart Ao fazer alterações de configuração (como atualizar hosts virtuais ou certificados SSL), sempre use reload. Isso aplica as alterações de forma suave enquanto as conexões existentes continuam ininterruptas. Use restart apenas se reload falhar ou se você precisar redefinir completamente os processos trabalhadores.

Antes de qualquer recarga, execute:

sudo nginx -t && sudo systemctl reload nginx

Esse padrão de uma linha evita o erro mais comum: recarregar uma configuração quebrada e derrubar um servidor em funcionamento. Se nginx -t falhar, o comando de recarga não será executado.

Validando Arquivos de Configuração

A causa mais comum de falha na inicialização ou comportamento inesperado no Nginx é um erro de sintaxe nos arquivos de configuração (nginx.conf ou arquivos incluídos em /etc/nginx/sites-available/). O Nginx fornece um excelente utilitário de teste integrado.

3. Testando a Sintaxe da Configuração

A flag -t testa os arquivos de configuração quanto a erros de sintaxe e verifica se os caminhos dos arquivos de configuração são válidos.

sudo nginx -t

Exemplo de Saída Bem-sucedida:

nginx: a sintaxe do arquivo de configuração /etc/nginx/nginx.conf está ok
nginx: o teste do arquivo de configuração /etc/nginx/nginx.conf foi bem-sucedido

Exemplo de Saída de Erro:

Se existir um erro, o Nginx apontará para o arquivo e número da linha exatos. Por exemplo, um ponto e vírgula ausente:

nginx: [emerg] diretiva desconhecida "server_name example.com" em /etc/nginx/sites-enabled/default:15
nginx: o teste do arquivo de configuração /etc/nginx/nginx.conf falhou

Esse feedback imediato permite que você vá diretamente para a linha 15 do arquivo especificado para corrigir o erro de digitação.

Às vezes, a linha relatada é apenas onde o Nginx finalmente notou o problema. Uma } ou ; ausente pode estar algumas linhas antes. Se o erro apontar para uma diretiva de aparência normal, inspecione o bloco acima dela.

4. Exibindo a Configuração Ativa

Para ver exatamente o que o Nginx está executando atualmente (especialmente útil após várias mesclagens de configuração ou includes complexos), use a flag -T (T maiúsculo):

sudo nginx -T

Isso gera toda a configuração ativa, que pode ser canalizada para um arquivo para comparação ou revisão detalhada:

sudo nginx -T > current_nginx_config.txt

Tenha cuidado ao compartilhar a saída de nginx -T. Ela pode incluir nomes de host internos, caminhos de certificados, cabeçalhos de proxy e, às vezes, segredos passados como cabeçalhos. Para trabalho de incidente, é excelente. Para tickets ou chat, redija primeiro.

Verificando Portas e Ouvintes

Se o Nginx não iniciar e os logs mencionarem bind() to 0.0.0.0:80 failed, outro processo pode já estar ouvindo na porta.

sudo ss -ltnp | grep -E ':80|:443'

A saída típica mostra o endereço local, porta e nome do processo. Se Apache, Caddy, um proxy de contêiner ou um processo antigo do Nginx estiver segurando a porta, o Nginx não poderá se ligar a ela.

Você também pode confirmar o comportamento público do próprio servidor:

curl -I http://127.0.0.1
curl -Ik https://127.0.0.1

-I busca apenas cabeçalhos. -k ignora a validação do certificado, o que é útil ao testar localhost contra um certificado emitido para um nome de domínio. De outra máquina, teste o nome de host real também:

curl -I https://example.com

Se localhost funcionar, mas o nome de host público falhar, observe as regras de firewall, grupos de segurança em nuvem, DNS, balanceadores de carga ou configuração de CDN.

Vale a pena verificar o DNS separadamente, pois ele pode fazer um servidor Nginx saudável parecer quebrado do lado de fora:

dig +short example.com
dig +short www.example.com

Certifique-se de que o endereço retornado seja o servidor ou balanceador de carga que você espera. Se você moveu o site recentemente, um DNS desatualizado pode enviar alguns usuários para o host antigo enquanto seus próprios testes atingem o novo.

Monitoramento e Análise de Logs

Se o Nginx iniciar com sucesso, mas servir páginas incorretas ou retornar erros 5xx, os logs se tornam a principal fonte de verdade.

5. Localizando Arquivos de Log Chave

Por padrão, os logs do Nginx geralmente são encontrados em /var/log/nginx/. Os dois arquivos essenciais são:

  • access.log: Registra cada solicitação manipulada pelo servidor, incluindo IP, hora da solicitação, código de status e recurso solicitado.
  • error.log: Registra avisos, notificações e erros críticos encontrados durante a operação ou processamento de solicitações.

6. Monitoramento de Logs em Tempo Real com tail

Para monitorar erros à medida que ocorrem, use o comando tail com a opção de seguir (-f) no log de erros.

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

Isso é inestimável ao testar um endpoint de aplicativo recém-implantado, pois você pode ver imediatamente se o Nginx ou o aplicativo upstream está gerando erros.

Para um servidor mais movimentado, siga apenas novas linhas de erro e mantenha os carimbos de data/hora visíveis:

sudo tail -n 50 -f /var/log/nginx/error.log

Em seguida, reproduza a solicitação com falha em outro terminal:

curl -I https://example.com/failing/path

Este fluxo de trabalho simples de dois terminais geralmente é mais rápido do que clicar em um navegador porque cada solicitação e entrada de log podem ser correspondidas diretamente.

7. Analisando Códigos de Status do Log de Acesso

Para problemas de alto tráfego, a verificação rápida do log de acesso em busca de códigos de status pode revelar problemas:

  • Códigos 4xx (Erros do Cliente): Geralmente indicam links quebrados, arquivos ausentes (404) ou problemas de permissão.
  • Códigos 5xx (Erros do Servidor): Indicam que o próprio Nginx falhou ao atender à solicitação, geralmente devido a timeouts de conexão upstream (502/504) ou falhas internas de processamento do servidor (500).

Use grep para filtrar códigos específicos. Por exemplo, encontrando todos os erros 502 Bad Gateway:

sudo grep ' 502 ' /var/log/nginx/access.log | tail -n 20

Uma contagem rápida de código de status pode mostrar se você está lidando com uma URL ruim ou um incidente mais amplo:

sudo awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head

Padrões comuns:

  • Picos de 404 geralmente significam um caminho de implantação ruim, arquivos estáticos ausentes ou rotas alteradas.
  • 403 geralmente aponta para permissões de arquivo, permissões de diretório ou uma regra de acesso intencional.
  • 502 geralmente significa que o Nginx não conseguiu obter uma resposta válida do serviço upstream.
  • 504 geralmente significa que o serviço upstream aceitou a conexão, mas não respondeu a tempo.

Para falhas upstream, verifique também o serviço de aplicativo:

sudo systemctl status myapp
sudo journalctl -u myapp -n 100 --no-pager

Substitua myapp pelo nome real do serviço. O Nginx só pode fazer proxy do que está ativo e acessível.

Diagnósticos Avançados: Verbosidade e ID do Processo

8. Forçando Log de Depuração (Cuidado Aconselhado)

Em situações muito complicadas, aumentar o nível de log pode revelar informações mais detalhadas sobre o processamento de solicitações. Isso é feito modificando a diretiva error_log em sua configuração para debug.

Aviso: O log de depuração gera grandes quantidades de dados muito rapidamente e deve ser usado apenas temporariamente para solução de problemas ativa, pois impacta severamente o desempenho.

Após alterar a diretiva, você deve usar reload ou restart no Nginx para que a alteração entre em vigor.

9. Encontrando o ID do Processo Mestre do Nginx (PID)

O ID do Processo (PID) é útil para enviar sinais específicos ao processo mestre em execução (por exemplo, para desligamento suave ou recarga suave fora do systemctl). O PID geralmente é armazenado em um arquivo, geralmente /var/run/nginx.pid.

cat /var/run/nginx.pid
# Exemplo de saída: 1234

Você pode então usar o comando kill se necessário (por exemplo, sudo kill -HUP 1234 para forçar uma recarga usando o PID):

A maioria dos operadores deve preferir systemctl reload nginx porque passa pelo gerenciador de serviços e é mais fácil de auditar. Sinais ainda são úteis em sistemas mínimos, contêineres ou hosts mais antigos onde o systemd não está gerenciando o processo.

Correções Comuns de Linha de Comando por Sintoma

Se o Nginx falhar após uma edição de configuração:

sudo nginx -t
sudo journalctl -u nginx -n 80 --no-pager

Corrija o arquivo e a linha relatados e teste novamente antes de recarregar.

Se HTTPS falhar após a renovação do certificado:

sudo nginx -t
sudo ls -l /etc/letsencrypt/live/example.com/
sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -noout -dates -subject

Isso confirma que o arquivo de certificado existe e mostra o assunto e as datas de validade.

Se arquivos estáticos retornarem 403:

namei -l /var/www/example.com/index.html

namei -l imprime permissões para cada diretório no caminho. O Nginx precisa de permissão de execução nos diretórios pai e permissão de leitura nos arquivos.

Se um proxy reverso retornar 502:

sudo grep 'connect() failed' /var/log/nginx/error.log | tail
sudo ss -ltnp | grep 3000
curl -I http://127.0.0.1:3000

Isso verifica se o upstream está ouvindo e se responde localmente.

Se o upstream for um socket Unix em vez de uma porta TCP, verifique o caminho do socket e as permissões:

sudo ls -l /run/myapp/myapp.sock
sudo grep -R "proxy_pass" /etc/nginx/sites-enabled /etc/nginx/conf.d

O usuário trabalhador do Nginx precisa de permissão para acessar o socket. Em muitos sistemas, esse usuário é www-data ou nginx, mas confirme isso em nginx.conf antes de alterar a propriedade ou os grupos.

Para falhas intermitentes, compare solicitações bem-sucedidas e com falha no log de acesso. Uma pequena amostra geralmente é suficiente:

sudo grep ' 504 ' /var/log/nginx/access.log | tail -n 20
sudo grep ' 200 ' /var/log/nginx/access.log | tail -n 20

Procure padrões em caminhos, campos de tempo de resposta upstream se seu formato de log os incluir, ou um IP de cliente específico que está acionando solicitações pesadas.

Fluxo de Trabalho de Solução de Problemas

Ao enfrentar um problema com o Nginx, siga esta sequência:

  1. Verificar Status: sudo systemctl status nginx.
  2. Testar Configuração: Se falhou ao iniciar, execute sudo nginx -t. Corrija os erros relatados.
  3. Reiniciar/Recarregar: Se a configuração foi modificada, use sudo systemctl reload nginx.
  4. Monitorar Logs: Se estiver em execução, mas quebrado, use sudo tail -f /var/log/nginx/error.log enquanto reproduz o problema.
  5. Analisar Acesso: Revise access.log para códigos de status que indiquem a natureza da falha (4xx vs 5xx).

Essa ordem evita que você fique adivinhando. O status informa se o Nginx está em execução, os testes de configuração informam se ele pode carregar, os logs informam o que aconteceu durante solicitações reais, e as verificações locais de curl separam problemas do Nginx de problemas upstream ou de rede.

Mantenha uma pequena nota de incidente enquanto trabalha: comando executado, resultado visto e alteração feita. Isso evita verificações repetidas e torna a transferência muito mais fácil.