【问题标题】:Mysterious Http 408 errors in AWS elasticbeanstalk-access_logAWS elasticbeanstalk-access_log 中的神秘 Http 408 错误
【发布时间】:2016-07-10 13:14:55
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    当我在配置 -> 负载平衡下关闭“连接耗尽”时,错误从日志中消失了。

    这里是最好的部分: 当我再次打开 Connection Draining 时,错误没有出现!

    因此,似乎在 AWS Load-Balancer 上关闭和打开它也可以工作(不仅在 Windows 上......)

    【讨论】:

    • 我不知道谁以及为什么不赞成这个答案,但当时我添加了这个答案,AWS 确实以这种方式工作。那时我在这个问题上花了很多时间,相信我:即使这个解决方案听起来很有趣,这也是当时对我来说唯一可行的解​​决方案。即使现在已经修复,它仍然可以帮助人们意识到,有时这些简单的想法仍然在这里或那里有效。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      编辑:你有经典的负载均衡器吗?通过使用 Elastic Beanstalk cli 创建新环境并选择应用程序负载均衡器,更改为应用程序负载均衡器。这将解决这个问题。


      ELB 有一种称为预打开连接的机制。 ELB 这样做是为了更快地处理您的请求,即您的新请求不必在 ELB 等待额外的时间,以便在请求发送到后端之前打开与后端的新连接。如果您有较低的保持活动超时,导致预先打开的连接更快地关闭,这将使您的后端生成 408 错误响应以指示连接已关闭,因为客户端 (ELB) 超时已过期而 ELB 未发送任何请求在那个特定的连接上。

      如果你修改了ELB空闲连接超时,那么你需要确保你的http keep-alive超时值大于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>
      

      【讨论】:

      • 您遇到了缩进问题。 mode(及以下)都需要缩进一级。
      【解决方案4】:

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

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

      【讨论】:

      • 这对我有用,似乎需要在 LB 上为我切换默认设置;一个用于 LB 上的 80/HTTP 和实例上的 80/HTTP,另一个 LB 上的 443/HTTPS,实例上的 80/HTTP。
      • 不知道它是如何变回 443 的,在我看到这个答案之前从不费心检查。我已经有2天了。谢谢
      【解决方案5】:

      这可能是因为实例 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>
      

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 2015-03-13
        • 2017-04-20
        • 2014-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多