gpt4 book ai didi

logging - 如何让nginx打印tcp流的完整日志

转载 作者:行者123 更新时间:2023-12-04 11:11:49 26 4
gpt4 key购买 nike

我正在使用具有以下配置的 nginx-1.11.8。

stream {

log_format basic '$time_iso8601 $remote_addr '
'$protocol $status $bytes_sent $bytes_received '
'$session_time $upstream_addr '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

access_log logs/stream.log basic buffer=1k flush=5s;

include *.stream.conf;
}

现在我只能在 tcp 日志中获取 IP 和其他不重要的东西。 tcp数据包中有一些IP相关的重要信息我想知道。我应该怎么做才能在 tcp 日志中获取完整的 tcp 数据包?提前致谢。

最佳答案

我不认为这对于股票 nginx 是可能的,尽管有一天可能会通过 openresty 实现。 ngx_stream_lua_module仍处于起步阶段,可能尚未开发出支持偷看流内容的功能。他们也可能接受功能请求。

至于为什么,例如$request_body不存在于 stream在今天的背景下,我认为有几个原因:

  • 与 HTTP 支持相比,流支持仍然有些新
  • Nginx 不讲底层协议(protocol)(当然,您可以通过 stream 块放置 HTTP 流量,但 nginx 处理它的方式与非 HTTP 流量没有任何不同)
  • 因此,存在 nginx 无法明确回答的问题,例如:
  • 什么是请求?
  • 它从哪里开始?
  • 它在哪里结束?
  • 它甚至有类似“ body ”的东西吗?
  • 甚至有“请求”这样的东西吗?
  • http上下文,nginx 已经需要实现请求的缓冲以支持使用多个 server 重试它们upstream 中的行当一个失败时阻止。使用任意 TCP 协议(protocol)执行此操作是不安全的(哎呀,在所有情况下使用 HTTP 执行此操作都不安全,但这是服务器管理员的关注点)。 stream 中目前不存在此类功能上下文,因此没有缓冲区可以为变量提供缓冲。

  • 对于 nginx 无法回答的那些问题的详细说明,乍一看可能很愚蠢,请考虑 TCP 是一个非常通用的协议(protocol)。建立在 TCP 之上的最简单的应用层协议(protocol)定义了一个非常基本的请求 - 响应模型,其中一端发送一个纯文本请求,后跟一个分隔符,而另一端等待请求,然后发送一个纯文本响应,后跟一个分隔符,然后一侧或两侧关闭连接。在这些情况下,当然,捕获和记录请求和响应似乎很简单。

    然而,许多更复杂的协议(protocol)不是这样工作的。有些协议(protocol)甚至根本不在请求-回复模型上运行,而是异步的,任何一方都可以随时发送“消息”,例如 WebSockets、STOMP 或 AMQP。流中可能根本没有分隔符,或者分隔符可能隐藏在压缩和加密层下,并且并非所有网络加密都是 SSL/TLS。此外,如果内容被编码为 ASN.1、Protobuf、Thrift、Avro 或类似的东西呢?您可能想要一个漂亮 pretty-print 表单,但 nginx 不能为您做到这一点,并且在日志中转储一堆二进制数据即使不是不可能可靠地解析也是很困难的。也可以像 SSH 一样嵌套“ channel ”或“ session ”。哎呀,即使使用请求-响应模型,哪一方发出请求和哪一方发送响应可能会在连接的生命周期内发生翻转。

    说了这么多,我认为处理常见的或至少是简单的情况是有争议的,所以也许有一天这会成为 nginx。在那之前,使用 socat 在 nginx 前面或后面放置一个中介可能是最简单的。或其他网络调试工具。

    关于logging - 如何让nginx打印tcp流的完整日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083611/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com