Como eu vejo quais regras de reescrita do nginx estão sendo aplicadas a uma solicitação?

3

Estou tentando depurar por que algumas regras de reconfiguração não estão funcionando no meu servidor de teste, mesmo que elas funcionem na minha máquina virtual.

Parece que quando eu reinicio o nginx, não vejo minhas alterações.

Existe uma maneira de ver quais são os confs carregados reais no nginx ou registrar quais regras de reescrita estão sendo aplicadas às solicitações recebidas?

    
por AgmLauncher 07.12.2015 / 04:25

1 resposta

3

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.

    
por 07.12.2015 / 04:49

Tags