用PHP理解Apache上的"408 Request Timeout"

Vic*_*nov 14 php apache2 http-error http-status-code-408

问题描述 - Apache日志

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

166.147.68.243 [24/Feb/2013:06:06:25 -0500] 19 web-site.com "-" 408 - "-"
Run Code Online (Sandbox Code Playgroud)

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

LogFormat "%h %t %D %V \"%r\" %>s %b \"%{User-agent}i\"" detailed
Run Code Online (Sandbox Code Playgroud)

通常日志文件中的行看起来像

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"
Run Code Online (Sandbox Code Playgroud)

这就是为什么408错误行对我来说很奇怪.没有记录请求,我不知道应该优化什么.

问题

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

我正在解决这个问题,因为我们的客户抱怨他的手机上有408错误.我在日志文件中发现了很多记录,但我不得不承认我不知道如何处理这个问题.


我自己的研究

这里有几个关于这个问题的问题.但人们更加具体.就像他们讨论某些特定客户端软件和脚本的问题一样.这里我在iPhone上打开一些页面时遇到错误.

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

猜猜#1

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

建议是将Timeoutconfig参数更新回其默认值.

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300
Run Code Online (Sandbox Code Playgroud)

我首先尝试了30的值,因为我认为30秒就足够了.但即使有300秒的默认值,我仍然会在日志中得到错误.tail -f当我写这篇文章时,我做了几分钟后得到了超过10行.

对我来说,这看起来并不完整.

Vic*_*nov 11

经过一些关于这个问题的研究,我得出了以下答案.它由我们的首席开发人员提供,我认为它对该主题给出了很好的解释.

这些错误是完全正常的.它们不是更大问题的标志,但正常连接使Apache打开时间超过允许时间.

例如,客户端一遍又一遍地运行它们的查询使Apache保持打开状态.Apache通过恰当地关闭他来做出回应.

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

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

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

回到Apache 1.3的时代,这个错误很常见,但是随后出现了2.2并且它们被移除了,直到我们要求它被退回,因为它给了我们关于有多少人持有开放端口的想法,以及不要求实际资源等

我认为除了确保将Timeout设置为原始问题中描述的合理值之外,此处不应该做任何其他事情.


小智 5

实际上apache日志中的很多408消息都是现代浏览器中的结果预取机制。通过查看过去 3 年的 apache 日志,相同流量的 408 错误数量增加了一倍多。

  • @Jon-Eric 虽然很旧,但以下内容提供了 Chrome 预取的解释。[Chrome 的预连接如何破坏 HaProxy(和 HTTP)](https://www.copernica.com/en/blog/post/how-chromes-pre-connect-breaks-haproxy-and-http) (3认同)