nginx: Vollständige Anfrage / Antwort mit allen Headern protokollieren?

44

Wir haben einen Anwendungsserver, der manchmal hängt. Wir vermuten, dass dies auf eine schlechte Anfrage eines Kunden zurückzuführen ist.

Kann nginx die gesamte Anfrage / Antwort (wie Fiddler-Captures) in Dateien protokollieren, damit wir die Anfragen sehen können, die vor dem Hang gesendet wurden?

(Wir müssen wahrscheinlich pcap und diesen Ansatz vermeiden und alles in nginx machen)

Wenn nginx nicht das richtige Werkzeug dafür ist, was (außer einem Netzwerkanalysator) könnte es sein?

Sam Smith
quelle
1
mitmproxy im Reverse-Proxy-Modus sollte das tun, wonach Sie suchen.
Vivek Thomas
@VivekThomas das ist eine Nginx-Frage ... wir verwenden bereits Nginx und werden uns nicht ändern.
Samsmith
3
@samsmith Alte Frage, aber vielleicht hilft das jemand anderem: Du musst nginx nicht aufgeben. Abhängig von den Umständen können Sie nginx nur vorübergehend auf einen anderen Port umleiten, damit mitmproxy den Datenverkehr abfangen und das Debuggen unterstützen kann. Anschließend können Sie nginx einfach auf den ursprünglichen Port umleiten und mitmproxy herunterfahren.
Per Lundberg
1
Sie können modsecurity Modul verwenden, die volle Anforderungen / Antworten anmelden können, finden Sie nginx.com/blog/modsecurity-logging-and-debugging
Willem

Antworten:

44

Um den von Besuchern gesendeten Anforderungshauptteil abzurufen, verwenden Sie client_body_in_file_only on;die "temporäre" Datei, in die sie geschrieben wurde, und protokollieren Sie sie, indem Sie var $request_body_filean das Protokollformat anhängen . "Temporäre" Dateien befinden sich standardmäßig im Verzeichnis client_temp.

Sie können auch Anforderungsheader protokollieren $http_<header>und Header mit versenden $sent_http_<header>.

Wenn Sie einen Anfragetext und Kopfzeilen haben, sollten Sie ihn wiedergeben und die Antwort Ihres Besuchers erhalten können.

So etwas wie auch gären sollte sehr in Betracht gezogen werden , so dass Sie den Verkehr auf einer anderen Umgebung wiedergeben könnten , wo Sie diese temporären Dateien , ohne dass IO Probleme in der Produktion nginx schreiben lassen können (nginx sie nicht mit bereinigen wird onWert, ist , warum es nicht , dass „temporäre“ in diesem Fall).

Xavier Lucas
quelle
1
@jwadsack Lies die Antwort sorgfältig durch.
Xavier Lucas
4
@ XavierLucas Ich dachte, Sie bieten zwei verschiedene Ansätze. Ich wusste nicht, dass Sie beides sagten client_body_in_file_onlyund $http_<header>gebraucht würden. Ich verstehe das jetzt.
Jwadsack
5
Könnten Sie bitte einen genaueren Code mitteilen?
Velkan
3
Sicherlich ist $ http <header> nur nützlich, wenn Sie alle Headernamen im Voraus kennen
Ed Randall
2
Kann jemand bitte ein aktuelles Fragment der Nginx-Konfiguration teilen?
Nowaker
17

mitmproxy scheint das richtige Werkzeug zu sein, um das zu tun, wonach Sie fragen.

mitmproxy ist ein interaktiver, SSL-fähiger Man-in-the-Middle-Proxy für HTTP mit einer Konsolenschnittstelle.

mitmdump ist die Befehlszeilenversion von mitmproxy. Denken Sie an tcpdump für HTTP.

Eigenschaften

  • Fangen Sie HTTP-Anforderungen und -Antworten ab und ändern Sie sie im laufenden Betrieb.
  • Speichern Sie vollständige HTTP-Konversationen für eine spätere Wiedergabe und Analyse.
  • Wiederholen Sie die clientseitige HTTP-Konversation. Wiederholen Sie HTTP-Antworten eines zuvor aufgezeichneten Servers.
  • Proxy-Modus umkehren, um Datenverkehr an einen bestimmten Server weiterzuleiten.
  • Transparenter Proxy-Modus unter OSX und Linux.
  • Nehmen Sie mithilfe von Python Skriptänderungen am HTTP-Datenverkehr vor.
  • SSL-Zertifikate zum Abfangen werden im laufenden Betrieb generiert.

Im Reverse-Proxy-Modus können Sie die Anforderung und die Antwort genau wie bei Fiddler erfassen.

Vivek Thomas
quelle