Como depurar o nginx além do log de erros?

34

No momento, estou recebendo uma inundação HTTP bastante grande no momento e está fazendo com que meu proxy reverso nginx produza um 502 Bad Gateway.

Eu tenho um servidor front-end executando o nginx como um proxy para o meu servidor back-end, mas está recebendo apenas alguns connect() failed (110: Connection timed out) while connecting to upstreamerros. Toneladas deles. Se eu ignorar o servidor proxy para conectar-me ao back-end, posso executar o site muito bem, então sei que ele está no proxy reverso em algum lugar. No entanto, não tenho idéia de como determinar por que está chegando ao tempo limite.

Qualquer ajuda?

executando o nginx 1.2.3 no CentOS 6.2

Roubar
fonte
Você pode começar atualizando o Nginx para a versão mais recente. Embora eu não esteja ciente desse bug no 1.2.3
Ben Lessani - Sonassi 1/01
2
.... e, em seguida, ter um olhar para o que for que recuse a CONNECIONS DE NGINX
symcbean
Qual é o seu servidor back-end? Eu já me confundi com erros quando o erro que o Nginx estava cometendo vinha realmente do back-end. Não parece o caso aqui, mas você precisa atualizar sua pergunta com mais detalhes.
jeffatrackaid
Além disso, você está se conectando através de uma rede pública / privada ao back-end? Os IPs do proxy estão na lista de permissões em firewalls, ddos ​​ou outras ferramentas do tipo de limite de IP / taxa? Como é um netstat no servidor de back-end? Quantas conexões estão abertas? O que é o MaxClients no back-end? Você está esgotando isso?
jeffatrackaid

Respostas:

19

Suponho que você já tenha aumentado o nível de log de erro do Nginx para depuração. Caso contrário, comece por aí.

Sua melhor aposta provavelmente será usada stracepara visualizar as chamadas do sistema feitas pelo Nginx. Em particular, você deve prestar atenção às connect()chamadas e ficar de olho nos códigos de retorno ( man 2 connectpode ser seu amigo aqui).

Depois de obter essas informações, é possível adivinhar melhor se o problema está confinado ao seu proxy de front-end ou se tem algo a ver com as interações entre o proxy e o servidor de aplicativos de back-end.

jgoldschrafe
fonte
37

Não fica muito mais pedante do que isso, a menos que você queira colocar sondas dtrace:

  1. Defina o nível do log de depuração: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. Configure o tcpdump em outra janela:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. Monitore os arquivos de log em outra janela:

    tail -f /var/log/nginx/*
    
  4. Inicialize o nginx interativamente com o strace:

    # top of /etc/nginx/nginx.conf:
    
    daemon off; # todo testing remove me not for production use
    

    E depois

     $ strace nginx 
    

Depuração adicional pode ser realizada com um nginx compilado com --with-debug. Verifique executando:

    nginx -V 2>&1 | grep -- '--with-debug' # no output if not debug

Outro bom módulo não compilado por padrão é: HttpStubStatusModule . Com toda a probabilidade, qualquer configuração decente exigirá um nginx compilado de forma personalizada (embalagem altamente recomendável usando as ferramentas de embalagem da distro).

A maioria deles não é adequada para uso em produção; veja compilar o nginx com o gperf, se você precisar de mais estatísticas.

Jacob
fonte
no passo 2, os seguintes trabalhos para mim: tcpdump -i qualquer não porta 22 -vvv -s0 q -XXX
ccppjava
5

Parece que você está depurando um site de alto tráfego.

Use debugcom a debug_connectiondiretiva para que o log de erros do nginx mostre logs de depuração apenas do seu IP.

Depois de começar a ver alguns logs de erros úteis, em vez de ativar a opção de depuração para toda a configuração do nginx, adicione uma error_log /path/to/some/file/ debug;diretiva separada no location {..}bloco responsável pela conexão reverse_proxy.

Dessa forma, você poderá isolar o log de erros de depuração apenas do seu IP.

Tente relacioná-lo com a solicitação que você está fazendo (no seu navegador).

Por exemplo, verifique: https://easyengine.io/tutorials/nginx/debugging/

Um nível adiante, você pode usar o HttpEchoModule do Nginx

rahul286
fonte
2

Nunca achei o Nginx um gargalo, na maioria dos casos é mais do que capaz do que o back-end. Mas se você testou sem o Nginx e não encontrou nenhum erro, será (ou ambos):

  1. Problema de configuração do Nginx
    1. Valor de tempo limite upstream incorreto
    2. URL do probe incorreto no upstream
    3. Poucos trabalhadores
    4. Etc.
  2. Gargalo de TCP / IP do sistema operacional
    1. Pode ser que o próprio proxy esteja causando uma duplicação de portas e estados abertos. Seja descritores de arquivos, portas, conexões TCP

Sem ver suas configurações do Nginx, ninguém pode comentar sobre o primeiro. E sem saídas adequadas do sistema operacional, ninguém pode comentar sobre o último.

Ben Lessani - Sonassi
fonte