使用 PHP 了解 Apache 上的“408 请求超时”
Posted
技术标签:
【中文标题】使用 PHP 了解 Apache 上的“408 请求超时”【英文标题】:Understanding “408 Request Timeout” on Apache with PHP 【发布时间】:2013-02-12 00:13:03 【问题描述】:问题描述 - 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-agenti\"" 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 Request timeout,建议在POST之前进行GET请求。如果我有自定义客户端,我可以这样做。但是我无法控制用户浏览器的行为。
猜猜#1
在网上搜索并思考问题时发现https://serverfault.com/questions/383290/too-many-408-error-codes-in-access-log
建议将Timeout
配置参数更新回其默认值。
#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
我首先尝试了值 30,因为我认为 30 秒应该足够了。 但即使使用 300 秒的默认值,我仍然会在日志中收到错误。我在写这篇文章时做了tail -f
,并在几分钟内得到了超过 10 行。
在我看来,这并不是一个完整的解决方案。
【问题讨论】:
我刚刚发现问题serverfault.com/questions/383290/… 我们的超时设置为 5 而不是默认的 30。我已将其更改回默认值 30。如果我仍然在日志文件中收到这些错误,我会尽快进行更新。 所以给出答案,解释为什么 serverfault 上的另一个问题是相同的,然后接受。 @mliebelt 你是什么意思? 您提出了一个问题,如果没有答案,您的问题将保持开放状态。因此,回答您(自己的)问题并在以后接受它作为正确答案是一个好习惯。请参阅etiquette for answering own questions。 【参考方案1】:经过对该主题的一些研究,我得出了以下答案。它由我们的首席开发人员提供,我认为它很好地解释了这个主题。
这些错误是完全正常的。它们并不是更大问题的迹象,而是使 Apache 保持打开状态的正常连接时间超过允许的时间。
例如,客户端的查询一遍又一遍地运行它们使 Apache 保持打开状态。 Apache 的回应是适当地关闭他。
如果没有,那么少数人可以接管我们的服务器,并且不允许其他任何人连接。
这些错误通常来自寻找漏洞的系统,您可以通过打开 telnet 会话并使其保持打开状态来重新创建它。
同时,tail -f 访问日志,在 X 时间 (KeepAliveTimeout) 内你会看到你的 IP 弹出相同的错误代码。
在 Apache 1.3 的日子里,这个错误很常见,但后来 2.2 出来了,他们把它删除了,直到我们有足够多的人要求返回它,因为它让我们知道有多少人在保持开放状态。端口,而不是请求实际资源等。
我认为除了确保将 Timeout 设置为我在原始问题中描述的某个合理值之外,这里不应该做任何其他事情。
【讨论】:
我认为KeepAliveTimeout
与此处无关 - 该设置用于控制在发送响应后保持连接打开的功能。这里的关键设置(如您所见)是Timeout
(整体请求/响应超时),但您可能会发现mod_reqtimeout
已启用并配置为更快地超时空请求(通过RequestReadTimeout
)。
其实 KeepAliveTimeout 是相关的。如果 KeepAlive 为 On,并且 HTTP 请求没有在 KeepAliveTimeout 时间内完成,则会导致 408 错误。如果 KeepAlive 为 Off,则 Timeout 指令优先。我一直在使用带有 Apache 服务器的慢速嵌入式设备对此进行测试。【参考方案2】:
实际上apache日志中的很多408消息是现代浏览器中的结果预取机制。 通过查看过去 3 年的 apache 日志,对于相同的流量,408 错误的数量增加了一倍以上。
【讨论】:
您能否链接到有关预取如何导致 408 错误的信息? @Jon-Eric 虽然老了,但下面提供了 Chrome 预取的解释。 How Chrome's pre-connect breaks HaProxy (and HTTP) 以及来自 HAProxy 的后续帖子:haproxy.com/blog/haproxy-and-http-errors-408-in-chrome【参考方案3】:如果在 Apache 中设置了 Proxy,并且后端由于某种原因没有及时响应,那么日志中会出现相同的 408 - -。代理超时是单独配置的,这就是为什么更改 Apache 默认超时似乎对这些请求没有任何作用。
【讨论】:
【参考方案4】:所有http请求都支持用户名和密码。没有用户名="-",没有密码="-",密码="*"。
【讨论】:
描述更多这个答案。以上是关于使用 PHP 了解 Apache 上的“408 请求超时”的主要内容,如果未能解决你的问题,请参考以下文章
PHP 5.2 和 PHP 5.3 在同一 Apache (Debian) 上的 vHost 中并排使用?
Ubuntu 14.04 上的 Apache2 不会加载 index.php