AWS elasticbeanstalk-access_log中出现神秘的Http 408错误

时间:2016-03-23 09:58:31

标签: http amazon-web-services elastic-beanstalk amazon-elb http-status-code-408

我们的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自己的服务之一。

5 个答案:

答案 0 :(得分:5)

编辑:您是否拥有经典的负载均衡器?通过使用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>

答案 1 :(得分:5)

我遇到了类似的问题:AWS Elastic Beanstalk上的HTTP错误代码408。为了解决此问题,我必须实施的解决方案是将Classic LB本身的实例端口和协议更改为80和HTTP。

最初,端口和协议都设置为443和HTTPS。因此,即使将LB端口和协议设置为443和HTTPS,也要确保将实例端口和协议设置为80。

答案 2 :(得分:1)

我们遇到了同样的问题,this AWS forum thread底部的建议解决了这个问题。简而言之,您应该确保Elastic Loadbalancer上的空闲时间configured比为每个实例上运行的Apache httpd配置的空闲timeout稍微更低

答案 3 :(得分:0)

这可能是因为实例keepalaive超时时间短于负载均衡器。 它必须比负载均衡器的空闲超时长几秒钟,才能在.ebextensions文件夹中创建配置,此内容将“ YOUR-TIME”替换为比实例负载均衡器的超时长的时间:

files:
  "/etc/httpd/conf.d/mod_reqtimeout.conf" :
    mode: "000644"
    owner: root
    group: root
    content: |
      <IfModule reqtimeout_module>
        RequestReadTimeout header=YOUR-TIME,MinRate=500 body=YOUR-TIME,MinRate=500
      </IfModule>

答案 4 :(得分:-4)

我在不同的环境中玩了几个小时的设置,这是解决方案:

当我关闭连接排水&#39;在配置下 - &gt;负载平衡,错误从日志中消失。

这是最好的部分: 当我再次打开连接耗尽时,错误没有回来!

所以似乎关闭它并在AWS Load-Balancer上工作(不仅仅在Windows上......)