Wie kann ich nginx über das Fehlerprotokoll hinaus debuggen?

34

Momentan erhalte ich eine ziemlich große HTTP-Flut und mein Nginx-Reverse-Proxy erzeugt einen 502 Bad Gateway.

Ich habe einen Front-End-Server, auf dem nginx als Proxy für meinen Back-End-Server ausgeführt wird, aber es treten nur eine Reihe von connect() failed (110: Connection timed out) while connecting to upstreamFehlern auf. Tonnen von ihnen. Wenn ich den Proxy-Server umgehe, um eine Verbindung zum Backend herzustellen, kann ich die Site problemlos ausführen, sodass ich weiß, dass sie sich irgendwo im Reverse-Proxy befindet. Ich habe jedoch keine Ahnung, warum das Zeitlimit überschritten wird.

Irgendeine Hilfe?

Ausführen von Nginx 1.2.3 unter CentOS 6.2

rauben
quelle
Sie könnten damit beginnen, Nginx auf die neueste Version zu aktualisieren. Allerdings ist mir ein solcher Fehler in 1.2.3
Ben Lessani - Sonassi vom
2
.... und dann schauen Sie sich an, was die Verbindungen von NGINX
ablehnen
Was ist Ihr Backend-Server? Ich war vorher durch Fehler verwirrt, als der Fehler, den Nginx aufspielte, tatsächlich vom Backend kam. Scheint hier nicht der Fall zu sein, aber Sie müssen Ihre Frage mit mehr Details aktualisieren.
Jeffatrackaid
Stellen Sie eine Verbindung zum Backend über ein privates / öffentliches Netzwerk her? Werden die IP-Adressen des Proxys in Firewalls, Ddos oder anderen Tools mit IP- / Ratenbeschränkung auf die Whitelist gesetzt? Wie sieht ein Netstat auf dem Backend-Server aus? Wie viele Verbindungen sind offen? Was ist MaxClients im Backend? Erschöpfst du die?
Jeffatrackaid

Antworten:

19

Ich gehe davon aus, dass Sie Ihre Nginx-Fehlerprotokollierungsstufe bereits für die Fehlerbehebung erhöht haben. Wenn nicht, fange dort an.

Ihre beste Wette wird wahrscheinlich stracedarin bestehen, die von Nginx ausgeführten Systemaufrufe anzuzeigen. Insbesondere sollten Sie auf connect()Anrufe achten und deren Rückgabecodes im Auge behalten ( man 2 connectkann hier Ihr Freund sein).

Sobald Sie diese Informationen haben, können Sie besser erraten, ob das Problem auf Ihren Front-End-Proxy beschränkt ist oder etwas mit den Interaktionen zwischen Proxy und Back-End-Anwendungsserver zu tun hat.

jgoldschrafe
quelle
37

Es wird nicht viel umständlicher als dies, es sei denn, Sie möchten Dtrace-Sonden einsetzen:

  1. Festlegen der Debugprotokollstufe: /etc/nginx/nginx.conf:

    ...
    http {
            ...
            error_log /var/log/nginx/error.log debug; # todo testing remove me not for production use
            ...
    }
    
  2. Richten Sie tcpdump in einem anderen Fenster ein:

    tcpdump not port 22 -vvv -s0 -q -XXX
    
  3. Überwachen Sie die Protokolldateien in einem weiteren Fenster:

    tail -f /var/log/nginx/*
    
  4. Nginx interaktiv mit strace starten:

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

    Und dann

     $ strace nginx 
    

Weiteres Debuggen ist mit einem Nginx möglich, der mit kompiliert wurde --with-debug. Überprüfen Sie es, indem Sie Folgendes ausführen:

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

Ein weiteres gutes Modul, das standardmäßig nicht kompiliert wird, ist: HttpStubStatusModule . Aller Wahrscheinlichkeit nach erfordert jedes anständige Setup ein speziell kompiliertes Nginx (sehr empfehlenswertes Verpacken mit den Verpackungstools von Distribution).

Die meisten davon sind für den Produktionsbetrieb ungeeignet. Wenn Sie weitere Statistiken benötigen, sollten Sie Nginx mit gperf kompilieren.

Jacob
quelle
In Schritt 2 funktioniert Folgendes für mich: tcpdump -i nicht Port 22 -vvv -s0 -q -XXX
ccppjava
5

Sieht so aus, als würden Sie eine stark frequentierte Site debuggen.

Verwendung debugmit debug_connectionDirektive so nginx Fehlerprotokoll wird nur Debug - Protokolle von Ihrer IP zeigen.

Sobald Sie einige nützliche Fehlerprotokolle sehen, anstatt die Debug-Option für die gesamte nginx-Konfiguration zu aktivieren, fügen Sie error_log /path/to/some/file/ debug;im location {..}Block, der für die reverse_proxy-Verbindung verantwortlich ist, eine separate Direktive hinzu.

Auf diese Weise können Sie das Debug-Fehlerprotokoll nur von Ihrer IP-Adresse isolieren.

Versuchen Sie, es mit der Anfrage zu verknüpfen, die Sie stellen (über Ihren Browser).

Beispiel: https://easyengine.io/tutorials/nginx/debugging/

Ein Level voraus können Sie das HttpEchoModule von Nginx verwenden

rahul286
quelle
2

Ich habe noch nie festgestellt, dass Nginx ein Flaschenhals ist. Aber wenn Sie ohne Nginx getestet haben und keinen Fehler gefunden haben, wird es entweder (oder beides) sein:

  1. Nginx-Konfigurationsproblem
    1. Upstream-Timeout-Wert falsch
    2. Falsche Probe-URL im Upstream
    3. Zu wenig Arbeiter
    4. Etc.
  2. TCP / IP-Engpass des Betriebssystems
    1. Es kann sein, dass der Proxy selbst eine Verdoppelung der offenen Ports und Zustände verursacht. Sei es Dateideskriptoren, Ports, TCP-Verbindungen

Ohne Ihre Nginx-Konfigurationen zu sehen, kann niemand die ersteren kommentieren. Und ohne geeignete Ausgaben des Betriebssystems kann sich niemand zu letzterem äußern.

Ben Lessani - Sonassi
quelle