web-dev-qa-db-fra.com

nginx: consigner la demande / réponse complète avec tous les en-têtes?

Nous avons un serveur d'applications qui se bloque parfois. Nous pensons que cela est dû à une mauvaise demande d'un client.

Nginx peut-il enregistrer la demande/réponse complète (comme les captures de violoneux) dans des fichiers, afin que nous puissions voir les demandes qui ont été envoyées avant le blocage?

(Nous devons probablement éviter pcap et cette approche et tout faire dans nginx)

Si nginx n'est pas le bon outil pour cela, quel (autre qu'un analyseur de réseau) pourrait être?

Pour obtenir le corps de la demande envoyé par les visiteurs, utilisez client_body_in_file_only on; et enregistrez le fichier "temporaire" dans lequel il est écrit dans les journaux en ajoutant var $request_body_file au format de journal. Les fichiers "temporaires" seront situés par défaut dans le répertoire client_temp.

Vous pouvez enregistrer les en-têtes de demande $http_<header> aussi et a envoyé des en-têtes avec $sent_http_<header>.

Si vous avez un corps de demande et des en-têtes, vous devriez pouvoir le rejouer et obtenir la réponse de votre visiteur.

Quelque chose comme gor devrait également être pris en compte afin que vous puissiez rejouer le trafic sur un autre environnement où vous pouvez laisser nginx écrire ces fichiers temporaires sans provoquer IO problèmes en production ( nginx ne les purgera pas avec la valeur on c'est pourquoi ce n'est pas si "temporaire" dans ce cas).

48
Xavier Lucas

mitmproxy semble être le bon outil pour faire ce que vous demandez.

mitmproxy est un proxy man-in-the-middle interactif compatible SSL pour HTTP avec une interface de console.

mitmdump est la version en ligne de commande de mitmproxy. Pensez à tcpdump pour HTTP.

Caractéristiques

  • Interceptez les requêtes et les réponses HTTP et modifiez-les à la volée.
  • Enregistrez des conversations HTTP complètes pour une relecture et une analyse ultérieures.
  • Relisez le côté client d'une conversation HTTP. Relisez les réponses HTTP d'un serveur précédemment enregistré.
  • Mode proxy inverse pour transférer le trafic vers un serveur spécifié.
  • Mode proxy transparent sous OSX et Linux.
  • Apportez des modifications par script au trafic HTTP à l'aide de Python.
  • Les certificats SSL pour l'interception sont générés à la volée.

Le mode proxy inverse vous permettrait de capturer la demande et la réponse comme le fait Fiddler.

17
Vivek Thomas