nginx: czy logować pełne żądanie / odpowiedź ze wszystkimi nagłówkami?

44

Mamy serwer aplikacji, który czasami się zawiesza. Podejrzewamy, że jest to spowodowane złym żądaniem klienta.

Czy nginx może zarejestrować pełne żądanie / odpowiedź (jak przechwytywanie skrzypka) do plików, abyśmy mogli zobaczyć żądania wysłane przed zawieszeniem?

(Prawdopodobnie musimy unikać PCAP i tego podejścia i zrobić to wszystko w Nginx)

Jeśli nginx nie jest odpowiednim narzędziem do tego, czym może być (poza analizatorem sieci)?

Sam Smith
źródło
1
mitmproxy w trybie odwrotnego proxy powinien robić to, czego szukasz.
Vivek Thomas
@VivekThomas to jest pytanie nginx .... już używamy nginx i nie zamierzamy się zmieniać.
samsmith
3
@samsmith Stare pytanie, ale może to pomaga komuś innemu: nie musisz rezygnować z Nginx. W zależności od okoliczności, możesz po prostu tymczasowo przekierować nginx do innego portu, aby umożliwić mitmproxy przechwycenie ruchu i wsparcie debugowania. Następnie, po zakończeniu, możesz po prostu przekierować nginx do oryginalnego portu i zamknąć mitmproxy.
Per Lundberg,
1
Możesz użyć modułu modsecurity, który może rejestrować pełne żądania / odpowiedzi, patrz nginx.com/blog/modsecurity-logging-and-debugging
Willem

Odpowiedzi:

44

Aby uzyskać treść żądania wysłaną przez odwiedzających, użyj client_body_in_file_only on;i zaloguj „tymczasowy” plik, do którego jest zapisany w logach, dołączając var $request_body_filedo formatu dziennika. Pliki „tymczasowe” będą domyślnie znajdować się w katalogu client_temp.

Możesz także rejestrować nagłówki żądań $http_<header>i wysyłać je za pomocą $sent_http_<header>.

Jeśli masz treść żądania i nagłówki, powinieneś być w stanie je odtworzyć i uzyskać odpowiedź od odwiedzającego.

Należy również wziąć pod uwagę coś takiego jak Gor , abyś mógł odtworzyć ruch w innym środowisku, w którym możesz pozwolić Nginxowi pisać te pliki tymczasowe bez powodowania problemów z IO w produkcji (nginx nie wyczyści ich onwartościowo, dlatego nie jest to takie „tymczasowe” w tym przypadku).

Xavier Lucas
źródło
1
@jwadsack Przeczytaj uważnie odpowiedź.
Xavier Lucas
4
@XavierLucas Myślałem, że udostępniasz dwa różne podejścia. Nie zdawałem sobie sprawy, że mówisz jedno client_body_in_file_only i drugie$http_<header> będzie potrzebne. Rozumiem to teraz.
jwadsack
5
Czy możesz podać dokładniejszy kod?
Velkan
3
Z pewnością $ http <header> jest przydatny tylko wtedy, gdy znasz wszystkie nazwy nagłówków z góry
Ed Randall
2
Czy ktoś może udostępnić rzeczywisty fragment konfiguracji nginx?
Nowaker
17

mitmproxy wydaje się być odpowiednim narzędziem do robienia tego, o co prosisz.

mitmproxy to interaktywne, obsługujące SSL pośrednie proxy dla HTTP z interfejsem konsoli.

mitmdump to wersja mitmproxy z linii poleceń. Pomyśl o tcpdump dla HTTP.

cechy

  • Przechwytuj żądania HTTP i odpowiedzi i modyfikuj je w locie.
  • Zapisz pełne rozmowy HTTP do późniejszego odtworzenia i analizy.
  • Odtwórz po stronie klienta rozmowy HTTP. Odtwórz odpowiedzi HTTP z wcześniej zarejestrowanego serwera.
  • Tryb odwrotnego proxy do przekazywania ruchu do określonego serwera.
  • Tryb transparentnego proxy w OSX i Linux.
  • Wprowadź skrypty do ruchu HTTP za pomocą Pythona.
  • Certyfikaty SSL do przechwytywania są generowane na bieżąco.

Tryb odwrotnego proxy pozwoliłby przechwycić żądanie i odpowiedź, tak jak robi to Fiddler.

Vivek Thomas
źródło