使用 PHP 了解 Apache 上的“408 请求超时”

问题描述 - Apache 日志

我在Apache日志文件中发现了与此类似的项目:

166.147.68.243 [24/Feb/2013:06:06:25 -0500] 19 web-site.com "-" 408 - "-"

我有自定义日志格式,这里代表状态。日志格式为:408

LogFormat "%h %t %D %V \"%r\" %>s %b \"%{User-agent}i\"" detailed

通常,日志文件中的行如下所示

184.73.232.108 [26/Feb/2013:08:38:16 -0500] 30677 www.site.com "GET /api/search... HTTP/1.1" 200 205 "Zend_Http_Client"

这就是为什么408错误线对我来说看起来很奇怪。没有记录任何请求,我不知道应该优化什么。

问题

如何解决这个问题?我应该收集哪些其他信息或日志?可能导致此问题的原因是什么?这是服务器上的问题吗?或者这绝对是网络连接问题?

我正在解决这个问题,因为我们的客户抱怨他的手机上有408错误。我在日志文件中找到了许多记录,但我不得不承认我不知道该怎么办。


我自己的研究

关于这个问题,这里已经有几个问题。但人们要具体得多。就像他们讨论一些特定的客户端软件和脚本的问题一样。在这里,我只是在iPhone上打开某些页面时遇到错误。

例如,在HTTP中,408请求超时,建议在POST之前执行GET请求。如果我有自定义客户端,我可以这样做。但是我无法控制用户浏览器的行为。

猜测 #1

在搜索互联网并思考这个问题时,我发现 https://serverfault.com/questions/383290/too-many-408-error-codes-in-access-log

建议将超时配置参数更新回其默认值。

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

我首先尝试了值30,因为我认为30秒应该足够了。但即使使用300秒的默认值,我也会继续在日志中获得错误。当我写这篇文章时,我做到了,并在几分钟内得到了超过10行。tail -f

对我来说,这似乎不是一个完整的解决方案。


答案 1

在对这个主题进行了一些研究之后,我得出了以下答案。它是由我们的首席开发人员提供的,我认为它很好地解释了这个主题。

这些错误是完全正常的。它们不是更大问题的迹象,而是保持Apache打开的时间超过允许时间的正常连接。

例如,客户端的查询一遍又一遍地运行它们,使Apache保持打开状态。Apache的回应是适当地关闭了他。

如果没有,那么少数人可以接管我们的服务器,不允许其他人连接。

大多数情况下,这些错误来自寻找漏洞利用的系统,您可以通过打开 telnet 会话并使其保持打开状态来重新创建它。

同时,在访问日志的尾部 -f,在 X 时间 (KeepAliveTimeout) 内,您将看到带有相同错误代码的 IP 弹出窗口。

回到Apache 1.3的时代,这个错误很常见,但后来2.2出来了,他们把它删除了,直到我们足够多的人要求它被退回,因为它给了我们关于有多少人只打开端口的想法,而不是请求实际的资源,等等。

我认为除了确保将Timeout设置为我在原始问题中描述的某个合理值之外,这里不应该做任何其他事情。


答案 2

实际上,Apache日志中的许多408条消息是现代浏览器中的结果预取机制。从过去3年的apache日志来看,对于相同的流量,408个错误的数量增加了一倍多。


推荐