我们的AWS EBS实例中的elasticbeanstalk-access_log日志文件包含408个错误,如下所示:
172.31.1.56 (-) - - [16/Mar/2016:10:16:31 +0000] "-" 408 - "-" "-"
172.31.1.56 (-) - - [16/Mar/2016:10:16:31 +0000] "-" 408 - "-" "-"
172.31.1.56 (-) - - [16/Mar/2016:10:16:31 +0000] "-" 408 - "-" "-"
172.31.1.56 (-) - - [16/Mar/2016:10:16:31 +0000] "-" 408 - "-" "-"
172.31.1.56 (-) - - [16/Mar/2016:10:16:31 +0000] "-" 408 - "-" "-"
172.31.1.56 (-) - - [16/Mar/2016:10:16:59 +0000] "-" 408 - "-" "-"
它们随机出现,有时它们之间有几分钟,有时在几秒钟内就会出现4-6个错误。当服务器上没有任何实际流量时,这些错误也会发生在我们的非公共登台环境中,因此这些请求的来源可能是AWS自己的服务之一。
编辑:你有经典的负载均衡器吗?通过使用Elastic Beanstalk cli创建新环境并选择应用程序负载均衡器,更改为应用程序负载均衡器。这将解决这个问题。
ELB有一种称为预打开连接的机制。 ELB执行此操作以便可以更快地提供您的请求,即您的新请求不必在ELB等待在请求发送到后端之前打开与后端的新连接所需的额外时间。如果你有一个较低的保持活动超时,导致预先打开的连接被更快地关闭,这将使你的后端生成408错误响应,以指示连接已关闭,因为客户端(ELB)超时已到期而没有ELB发送任何请求在那个特定的连接上。
如果已修改ELB空闲连接超时,则需要确保http保持活动超时值大于ELB空闲连接超时值。如果不是这种情况,则启用保持活动超时并确保该值大于ELB空闲连接超时。
您可以通过使用以下代码在ebextensions文件夹中添加.config文件来更改apache中的keepalive超时:
files:
"/etc/httpd/conf.d/keepalive.conf" :
mode: "000644"
owner: root
group: root
content: |
# Enable TCP keepalive
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 300
<IfModule mod_reqtimeout.c>
RequestReadTimeout header=300 body=300
</IfModule>
我有类似的问题:AWS Elastic Beanstalk上的HTTP错误代码408。我必须实现的解决方案是将Classic LB本身的Instance端口和协议更改为80和HTTP。
最初,端口和协议都设置为443和HTTPS。因此,即使将LB端口和协议设置为443和HTTPS,也要确保将实例端口和协议设置为80。
我们遇到了同样的问题,在this AWS forum thread底部提出的建议解决了这个问题。简而言之,您应该确保Elastic Loadbalancer上的空闲时间configured略低于为每个实例上运行的Apache httpd配置的空闲timeout。
我在不同的环境中玩了几个小时的设置,这是解决方案:
当我关闭Configuration - > Load Balancing下的'Connection Draining'时,错误将从日志中消失。
这是最好的部分:当我再次打开连接排水时,错误没有回来!
所以似乎关闭它并在AWS Load-Balancer上工作(不仅仅在Windows上......)