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
reloadem vez derestartAo fazer alterações de configuração (como atualizar hosts virtuais ou certificados SSL), sempre usereload. Isso aplica as alterações de forma suave enquanto as conexões existentes continuam ininterruptas. Userestartapenas sereloadfalhar 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
404geralmente significam um caminho de implantação ruim, arquivos estáticos ausentes ou rotas alteradas. 403geralmente aponta para permissões de arquivo, permissões de diretório ou uma regra de acesso intencional.502geralmente significa que o Nginx não conseguiu obter uma resposta válida do serviço upstream.504geralmente 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:
- Verificar Status:
sudo systemctl status nginx. - Testar Configuração: Se falhou ao iniciar, execute
sudo nginx -t. Corrija os erros relatados. - Reiniciar/Recarregar: Se a configuração foi modificada, use
sudo systemctl reload nginx. - Monitorar Logs: Se estiver em execução, mas quebrado, use
sudo tail -f /var/log/nginx/error.logenquanto reproduz o problema. - Analisar Acesso: Revise
access.logpara 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.