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

Jon*_*ica 59 nginx

我们有一个有时会挂起的应用程序服务器。我们怀疑这是由于来自客户的错误请求。

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

(我们可能需要避免 pcap 和这种方法,并在 nginx 中完成所有操作)

如果 nginx 不是用于此的正确工具,那么可能是什么(除了网络分析器)?

Xav*_*cas 53

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

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

如果您有请求正文和标题,您应该能够重播它并获得访问者的响应。

也应该高度考虑像gor这样的东西,这样你就可以在其他环境中重放流量,在那里你可以让 nginx 写入这些临时文件而不会在生产中导致 IO 问题(nginx 不会用on值清除它们,这就是为什么它不是“临时”在这种情况下)。

  • 你能分享一个更精确的代码吗? (16认同)
  • 当然 $http&lt;header&gt; 只有在您事先知道所有标头名称时才有用 (9认同)
  • 有人可以分享 nginx 配置的实际片段吗? (9认同)
  • @XavierLucas 我以为您提供了两种不同的方法。我没有意识到你在说_both_`client_body_in_file_only` 和`$http_&lt;header&gt;` 是需要的。我现在明白了。 (4认同)

Viv*_*mas 18

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

mitmproxy 是一个交互式的、支持 SSL 的、具有控制台界面的 HTTP 中间人代理。

mitmdump 是 mitmproxy 的命令行版本。想想 HTTP 的 tcpdump。

特征

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

反向代理模式可以让您像 Fiddler 一样捕获请求和响应。