Existem várias estratégias que você pode usar para depurar o processamento de solicitações e respostas do nginx.
Registo específico de regravação
Se você ativar a rewrite_log
directive em um bloco server
, recarregue Na config do nginx, você obterá toda uma pilha de informações (em notice
severity) sobre o que exatamente o nginx está fazendo com a sua solicitação à medida que ela é reescrita.
Se você precisar ir mais fundo do que isso, você pode ativar a depuração em um nível muito mais amplo.
Depuração ampla do host virtual
Ao definir o registro do nginx como debug
level, você terá uma conta extremamente detalhada de tudo o que o nginx faz ao processar solicitações e respostas. É muita informação, mas a resposta para todos os problemas que você tem com o nginx está contida nela.
A maneira mais fácil de obter o log de depuração é definir a gravidade na diretiva error_log
para o bloco server
que você deseja diagnosticar em debug
. Substitua qualquer palavra-chave de gravidade existente, como info
ou warn
. Se o bloco server
específico não tiver uma diretiva error_log
, você deverá adicionar uma (porque alterar o error_log
para debug
em todo o servidor resultará em um lote de ruído.
Depois de fazer essa alteração, você precisará fazer com que o nginx recarregue sua configuração (não é necessário reiniciar).
Exemplos:
Error_log existente com gravidade:
Altere isto:
server {
server_name foo.example.com;
error_log /var/log/nginx/foo.example.com.error_log info;
[...]
Para isso:
server {
server_name foo.example.com;
error_log /var/log/nginx/foo.example.com.error_log debug;
Error_log existente, sem gravidade existente:
Altere isto:
server {
server_name foo.example.com;
error_log /var/log/nginx/foo.example.com.error_log;
[...]
Para isso:
server {
server_name foo.example.com;
error_log /var/log/nginx/foo.example.com.error_log debug;
Nenhum error_log existente:
Altere isto:
server {
server_name foo.example.com;
[...]
Para isso:
server {
server_name foo.example.com;
error_log /var/log/nginx/foo.example.com.error_log debug;
Depuração direcionada por endereço IP
Se você estiver executando um site movimentado, até mesmo a depuração para um único vhost provavelmente terminará com uma grave degradação do desempenho (gravar um lote de registros no disco diminui o ritmo) e você tem muita depuração irrelevante para percorrer, que você nunca descobrirá o que está acontecendo.
Nesse caso, você pode habilitar a depuração somente para solicitações de endereços IP específicos (como a máquina da qual você está testando). Para isso, você deseja editar o arquivo de configuração principal do nginx (digamos, /etc/nginx/nginx.conf
), encontrar a seção events
e torná-la assim:
events {
debug_connection 192.0.2.42;
}
Substitua 192.0.2.42
pelo endereço IP que o nginx verá (portanto, possivelmente o endereço IP público do seu gateway NAT ou seu proxy, em vez do IP da sua estação de trabalho). Recarregue o nginx.
Você agora obterá logs de depuração para todas as conexões daquele IP (e somente desse IP). Se você precisar depurar solicitações de vários locais, poderá repetir a diretiva debug_connection
várias vezes ou especificar uma máscara de rede do estilo CIDR para cobrir um bloco inteiro de IPs.
Depuração guiada por laser
Se você decidir depurar apenas as solicitações em um determinado bloco location
, poderá adicionar uma diretiva error_log
em apenas nesse bloco e Assim, você pode gravar logs de depuração em um local separado. Algo assim vai fazer o truque:
server {
server_name foo.example.com;
location ~ ^/somewhere/.*\.php {
error_log /tmp/somewhere_php.log debug;
[...]
}
}
Agora você pode recarregar o nginx, fazer uma solicitação e procurar /tmp/somewhere_php.log
em todos os detalhes. Lembre-se de remover a diretiva novamente quando terminar, caso contrário, você provavelmente preencherá a partição /tmp
em um curto espaço de tempo.