nginx: ¿Registrar solicitud / respuesta completa con todos los encabezados?

44

Tenemos un servidor de aplicaciones que a veces se bloquea. Sospechamos que se debe a una mala solicitud de un cliente.

¿Puede nginx registrar la solicitud / respuesta completa (como las capturas de fiddler) en los archivos, para que podamos ver las solicitudes que se enviaron antes del bloqueo?

(Probablemente necesitemos evitar pcap y ese enfoque y hacerlo todo en nginx)

Si nginx no es la herramienta adecuada para esto, ¿qué (además de un analizador de red) podría ser?

Sam Smith
fuente
1
mitmproxy en modo proxy inverso debería hacer lo que está buscando.
Vivek Thomas
@VivekThomas esta es una pregunta de nginx ... ya estamos usando nginx y no vamos a cambiar.
samsmith
3
@samsmith Antigua pregunta, pero tal vez esto ayude a alguien más: no tiene que renunciar a nginx. Según las circunstancias, puede redirigir nginx a otro puerto temporalmente, para permitir que mitmproxy intercepte el tráfico y admita la depuración. Luego, una vez completado, puede redirigir nginx al puerto original y apagar mitmproxy.
Según Lundberg el
1
Puede usar el módulo modsecurity, que puede registrar solicitudes / respuestas completas, consulte nginx.com/blog/modsecurity-logging-and-debugging
Willem,

Respuestas:

44

Para que los visitantes envíen el cuerpo de la solicitud, use client_body_in_file_only on;y registre el archivo "temporal" en el que está escrito en los registros agregando var $request_body_fileal formato de registro. Los archivos "temporales" se ubicarán en el directorio client_temp de manera predeterminada.

También puede registrar encabezados de solicitud $http_<header>y encabezados enviados con $sent_http_<header>.

Si ha solicitado el cuerpo y los encabezados, debería poder reproducirlo y obtener la respuesta que tuvo su visitante.

También se debe considerar algo como gor para que pueda reproducir el tráfico en otro entorno en el que puede dejar que nginx escriba estos archivos temporales sin causar problemas de E / S en producción (nginx no los purgará con onvalor, por eso no es tan "temporal" en este caso).

Xavier Lucas
fuente
1
@jwadsack Lea la respuesta cuidadosamente.
Xavier Lucas
44
@XavierLucas Pensé que estabas proporcionando dos enfoques diferentes. No me di cuenta de que estabas diciendo ambas cosas client_body_in_file_only y $http_<header>que sería necesario. Lo entiendo ahora.
jwadsack
55
¿Podría por favor compartir un código más preciso?
Velkan
3
Seguramente $ http <header> solo es útil si conoce todos los nombres de encabezado de antemano
Ed Randall
2
¿Alguien puede compartir un fragmento real de la configuración de nginx, por favor?
Nowaker
17

mitmproxy parece ser la herramienta adecuada para hacer lo que está pidiendo.

mitmproxy es un proxy de hombre en el medio interactivo con capacidad SSL para HTTP con una interfaz de consola.

mitmdump es la versión de línea de comandos de mitmproxy. Piense en tcpdump para HTTP.

Caracteristicas

  • Intercepte las solicitudes y respuestas HTTP y modifíquelas sobre la marcha.
  • Guarde conversaciones HTTP completas para su posterior reproducción y análisis.
  • Reproduzca el lado del cliente de una conversación HTTP. Reproduzca las respuestas HTTP de un servidor previamente grabado.
  • Invierta el modo proxy para reenviar el tráfico a un servidor específico.
  • Modo proxy transparente en OSX y Linux.
  • Realice cambios con secuencia de comandos en el tráfico HTTP utilizando Python.
  • Los certificados SSL para la intercepción se generan sobre la marcha.

El modo proxy inverso le permitiría capturar la solicitud y la respuesta al igual que lo hace Fiddler.

Vivek Thomas
fuente