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


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 komplette Anfrage / Antwort (wie Fiddler Captures) in Dateien protokollieren, damit wir die Anfragen sehen können, die vor dem Aufhängen gesendet wurden?

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

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


29
2017-10-14 05:24


Ursprung


Mitgefühl im Reverse-Proxy-Modus sollte tun, was Sie suchen. - Vivek Thomas
@VivekThomas das ist eine nginx Frage .... wir benutzen bereits nginx und werden uns nicht ändern. - samsmith
@samsmith Alte Frage, aber vielleicht hilft das jemand anderem: Sie nicht muss nginx aufgeben. Abhängig von den Umständen können Sie Nginx einfach vorübergehend an einen anderen Port weiterleiten, damit Mitmproxy den Datenverkehr abfangen und das Debugging unterstützen kann. Sobald Sie fertig sind, können Sie einfach nginx an den ursprünglichen Port umleiten und mitmproxy herunterfahren. - Per Lundberg
Sie können das Modul modsecurity verwenden, das vollständige Anfragen / Antworten protokollieren kann, siehe nginx.com/blog/modsecurity-logging-and-debugging - Willem


Antworten:


Um den von den Besuchern gesendeten Anfragetext zu erhalten, verwenden Sie client_body_in_file_only on; und protokolliere die "temporäre" Datei, in die es geschrieben wurde, indem du var anfügst $request_body_file zum Protokollformat. "Temporäre" Dateien befinden sich standardmäßig im Verzeichnis client_temp.

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

Wenn Sie einen Anfragetext und Header haben, sollten Sie in der Lage sein, sie wiederzugeben und die Antwort zu erhalten, die Ihr Besucher hatte.

Auch so etwas wie gor sollte in Betracht gezogen werden, damit Sie den Datenverkehr in einer anderen Umgebung wiedergeben können, in der Sie nginx diese temporären Dateien schreiben lassen können, ohne IO-Probleme in der Produktion zu verursachen (nginx wird diese nicht löschen) on Wert, deshalb ist es in diesem Fall nicht "temporär".


33
2017-10-14 08:10



Xavier, Danke! Funktioniert! Jetzt, wo ich die Dateien habe, wie wiederhole ich sie? - samsmith
@jwadsack Lies die Antwort sorgfältig. - Xavier Lucas
@XavierLucas Ich dachte, du würdest zwei verschiedene Ansätze anbieten. Ich habe nicht bemerkt, dass du es gesagt hast beide  client_body_in_file_only und $http_<header> würde benötigt werden. Ich verstehe das jetzt. - jwadsack
Könnten Sie bitte einen präziseren Code teilen? - Velkan
Sicherlich ist $ http <header> nur nützlich, wenn Sie alle Headernamen im Voraus kennen - Ed Randall


Mitgefühl scheint das richtige Werkzeug zu sein, um das zu tun, was 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

  • Abfangen von HTTP-Anfragen und -Antworten und Ändern von ihnen im laufenden Betrieb.
  • Speichern Sie vollständige HTTP-Konversationen für spätere Wiedergabe und Analyse.
  • Wiederholen Sie die Clientseite von HTTP-Konversationen. Wiederholen Sie die HTTP-Antworten eines zuvor aufgezeichneten Servers.
  • Reverse-Proxy-Modus zum Weiterleiten von Datenverkehr an einen bestimmten Server. 
  • Transparenter Proxy-Modus unter OSX und Linux.
  • Nehmen Sie mithilfe von Python Änderungen am HTTP-Datenverkehr vor.
  • SSL-Zertifikate zum Abfangen werden im laufenden Betrieb generiert.

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


15
2017-10-14 06:02