使用 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 请求超时”的主要内容,如果未能解决你的问题,请参考以下文章

为啥装了apache还要装PHP呢

Apache+PHP 在 unix 上的写权限

PHP 5.2 和 PHP 5.3 在同一 Apache (Debian) 上的 vHost 中并排使用?

Ubuntu 14.04 上的 Apache2 不会加载 index.php

在一台 Apache 服务器上的单独虚拟主机中运行 Apache mod_php 和 mod_fastcgi

apache 上的 php5,为啥需要 libmod 和 php5?