让 Apache 在请求进入时记录请求,而不是在请求完成时记录请求

让 Apache 在请求进入时记录请求,而不是在请求完成时记录请求

我正在尝试诊断一个奇怪的服务器崩溃问题(服务器响应 ping,但直到重启才会接受 SSH 连接。0% CPU),重新启动服务器即可恢复正常。我希望我的 Apache 访问日志(或其他日志)包含崩溃发生时发出的所有请求,但不幸的是,Apache 直到请求完成后才会记录请求。这意味着如果某个请求导致服务器崩溃,则该请求永远不会完成,因此不会显示在日志中。

是否有某种方法可以配置 Apache 来创建一个在请求到达时写入的日志文件?

答案1

我认为您需要取证日志,请参阅此链接:http://httpd.apache.org/docs/current/mod/mod_log_forensic.html

片段:

法医日志格式:

每个请求都会被记录两次。第一次是在进一步处理之前(即在收到标头之后)。第二次日志条目是在请求处理之后写入的,与正常日志记录同时发生。

为了识别每个请求,会分配一个唯一的请求 ID。可以使用 %{forensic-id}n 格式字符串将此取证 ID 交叉记录在正常传输日志中。如果您使用 mod_unique_id,则将使用其生成的 ID。

第一行记录取证 ID、请求行和所有收到的标头,以竖线字符 (|) 分隔。示例行如下所示(全部在一行上):

+yQtJf8CoAB4AAFNXBIEAAAAAA|GET /manual/de/images/down.gif HTTP/1.1|Host:localhost%3a8080|User-Agent:Mozilla/5.0 (X11; U; Linux i686; en-US; rv%3a1.6) Gecko/20040216 Firefox/0.8|Accept:image/png,等等...

开头的加号表示这是该请求的第一行日志。第二行仅包含一个减号和 ID:

-yQtJf8CoAB4AAFNXBIEAAAAAA

check_forensic 脚本将日志文件的名称作为其参数。它会查找这些 +/- ID 对,并在请求未完成时发出警告。

答案2

Sandroid 的回答很适合您的问题,但您确实应该考虑运行网络数据包捕获。如果您有资源,镜像交换机内的端口并使用运行 WireShark 的第二台机器来记录所有 IP 流量可能会有所帮助。如果某些东西导致服务器瘫痪,以至于非 HTTP 服务无法响应,那么它可能会在坏数据到达 Apache 之前就导致 IP 堆栈瘫痪。

如果您能确保运行捕获的机器具有与其他机器不同的网络硬件和/或驱动程序。为了一台机器的代价而让两台机器崩溃,这太糟糕了。;-)

相关内容