nginx:使用所有标头记录完整的请求/响应?


44

我们有一个有时挂起的应用程序服务器。我们怀疑这是由于客户的要求不当所致。

Nginx可以将完整的请求/响应(例如Fiddler捕获)记录到文件中,以便我们可以看到挂起之前发送的请求吗?

(我们可能需要避免使用pcap和这种方法,并在nginx中全部完成)

如果nginx不是正确的工具,那么(网络分析仪除外)可能是什么?


1
反向代理模式下的mitmproxy应该可以满足您的需求。
维维克·托马斯

@VivekThomas这是一个nginx问题。...我们已经在使用nginx,并且不会改变。
samsmith

3
@samsmith旧问题,但这也许可以帮助其他人:您不必放弃nginx。根据具体情况,您可以临时将nginx重新路由到另一个端口,以允许mitmproxy拦截流量并支持调试。然后,一旦完成,您可以将nginx重新路由到原始端口并关闭mitmproxy。
Per Lundberg

1
您可以使用modsecurity模块,该模块可以记录完整的请求/响应,请参阅nginx.com/blog/modsecurity-logging-and-debugging
Willem,

Answers:


44

要获取访问者发送的请求正文,请client_body_in_file_only on;通过将var附加$request_body_file到日志格式来使用并记录将其写入日志的“临时”文件。默认情况下,“临时”文件位于client_temp目录中。

您也可以记录请求标头,$http_<header>并使用发送标头$sent_http_<header>

如果您有请求正文和标头,则应该可以重播它并获得访问者的响应。

另外,还应高度考虑gor等问题,以便您可以在其他环境中重播流量,在该环境中,可以让nginx写入这些临时文件而不会在生产中引起IO问题(nginx不会用其on值清除它们,这就是为什么它不是那么“临时”的在这种情况下)。


1
@jwadsa​​ck仔细阅读答案。
哈维尔·卢卡斯

4
@XavierLucas我以为您提供了两种不同的方法。我没意识到你在说这两个, client_body_in_file_only而且$http_<header>是必要的。我现在明白了。
jwadsa​​ck 2015年

5
您能否分享更精确的代码?
Velkan '17

3
当然,只有在您事先知道所有标头名称的情况下,$ http <header>才有用
Ed Randall

2
有人可以共享nginx配置的实际片段吗?
Nowaker

17

mitmproxy似乎是完成您所要求的正确工具。

mitmproxy是具有控制台接口的HTTP的交互式SSL中间人代理。

mitmdump是mitmproxy的命令行版本。将tcpdump用于HTTP。

特征

  • 拦截HTTP请求和响应,并即时对其进行修改。
  • 保存完整的HTTP对话,以供以后重播和分析。
  • 重播HTTP对话的客户端。重播先前记录的服务器的HTTP响应。
  • 反向代理模式将流量转发到指定的服务器。
  • OSX和Linux上的透明代理模式。
  • 使用Python对HTTP流量进行脚本化更改。
  • 用于拦截的SSL证书是即时生成的。

反向代理模式将使您像Fiddler一样捕获请求和响应。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.