nginx: Записать полный запрос / ответ со всеми заголовками?


44

У нас есть сервер приложений, который иногда зависает. Мы подозреваем, что это из-за неправильного запроса от клиента.

Может ли nginx регистрировать полный запрос / ответ (например, захват fiddler) в файлах, чтобы мы могли видеть запросы, которые были отправлены до зависания?

(Вероятно, нам нужно избегать pcap и такого подхода и делать все это в nginx)

Если nginx не является подходящим инструментом для этого, что (кроме сетевого анализатора) может быть?


1
mitmproxy в режиме обратного прокси должен делать то, что вы ищете.
Вивек Томас

@VivekThomas это вопрос nginx .... мы уже используем nginx и не собираемся менять.
Самсмит

3
@ samsmith Старый вопрос, но, возможно, это поможет кому-то еще: вам не нужно отказываться от nginx. В зависимости от обстоятельств вы можете просто временно перенаправить nginx на другой порт, чтобы позволить mitmproxy перехватывать трафик и поддерживать отладку. Затем, после завершения, вы можете просто перенаправить nginx на исходный порт и отключить mitmproxy.
За Лундберг

1
Вы можете использовать модуль modsecurity, который может регистрировать полные запросы / ответы, см. Nginx.com/blog/modsecurity-logging-and-debugging
Виллем

Ответы:


44

Чтобы получить тело запроса, отправленное посетителями, используйте client_body_in_file_only on;и зарегистрируйте «временный» файл, в который он записан в журналах, добавив var $request_body_fileв формат журнала. «Временные» файлы по умолчанию будут находиться в каталоге client_temp.

Вы также можете регистрировать заголовки запросов $http_<header>и отправлять заголовки с помощью $sent_http_<header>.

Если у вас есть тело запроса и заголовки, вы сможете воспроизвести его и получить ответ, который получил ваш посетитель.

Также следует рассмотреть что-то вроде gor, чтобы вы могли воспроизводить трафик в другой среде, где вы могли бы разрешить nginx записывать эти временные файлы, не вызывая проблем с вводом-выводом в производственной среде (nginx не будет очищать их onзначениями, поэтому это не так «временно»). в этом случае).


1
@jwadsack Внимательно прочитайте ответ.
Ксавье Лукас

4
@XavierLucas Я думал, что вы предлагаете два разных подхода. Я не понимал, что вы говорите и то, client_body_in_file_only и другое$http_<header> . Я понял это сейчас.
jwadsack

5
Не могли бы вы поделиться более точным кодом?
Велкан

3
Конечно, $ http <header> полезен, только если вы заранее знаете все имена заголовков
Эд Рэндалл,

2
Может кто-нибудь поделиться реальным фрагментом конфига nginx, пожалуйста?
Новакер

17

Mitmproxy кажется правильным инструментом для выполнения того, что вы просите.

mitmproxy - это интерактивный прокси-сервер типа «человек посередине» с поддержкой SSL для HTTP с консольным интерфейсом.

mitmdump - это версия mitmproxy для командной строки. Подумайте tcpdump для HTTP.

особенности

  • Перехватывайте HTTP-запросы и ответы и изменяйте их на лету.
  • Сохраните полные разговоры HTTP для последующего воспроизведения и анализа.
  • Воспроизвести на стороне клиента HTTP-разговоры. Воспроизвести HTTP-ответы ранее записанного сервера.
  • Режим обратного прокси для пересылки трафика на указанный сервер.
  • Прозрачный режим прокси в OSX и Linux.
  • Внесите скриптовые изменения в HTTP-трафик, используя Python.
  • SSL-сертификаты для перехвата генерируются на лету.

Режим обратного прокси позволит вам захватить запрос и ответ, как это делает Fiddler.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.