首页 文章

即使主机 Health 且能够提供请求,ELB也会返回HTTP 504错误

提问于
浏览
6

我有一个部署在Amazon Web Services(AWS)上的服务,特别是Elastic Load Balancer(ELB)后面的2个实例 . 可用区域被选为所有三个us-west-2a,b,c,但是上述3个区域中只有2个区域中有实例运行 .

问题是即使流量/负载不是太高,但我仍然经常从ELB得到HTTP 504错误 .

日志行如下所示

-1 -1 -1 504 0 0 0

按顺序, - request_processing_time --backend_processing_time --response_processing_time --elb_status_code --backend_status_code --received_bytes --sent_bytes . Description of what each field and response means can be found here

ELB空闲超时为60秒 . KeepAlive 在后端实例上是'On' . ELB的请求延迟受到控制 . 我试过增加 KeepAliveTimeout 但无济于事 .

有没有人知道如何进行?我甚至不知道这个问题的根本原因 .

PS:更像是第二个问题,有一些情况(当后端甚至不接受请求时,ELB返回的内容远远少于504),即使后端返回504,然后ELB将其转发给客户端 . 据我所知,只有当后端超时时,才应由代理返回HTTP 504 . 服务器本身如何返回504?

2 回答

  • 0

    为了将来可以帮助其他人,我在这里发表我的发现:

    1)这504 0 HTTP错误主要是因为logrotate重新加载apache而不是正常重启 . 当前AWS配置执行以下操作

    /sbin/service httpd reload > /dev/null 2>/dev/null || true
    

    所以用 apachectl -k graceful/sbin/service httpd graceful 替换服务命令

    我的ec2实例上的文件位置: /etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.httpd.conf

    2)因为默认情况下AWS中的logrotate频率太高(每小时一次),至少对于我的用例而言,反过来又是每小时重新加载apache,所以我也减少了它 .

  • 6

    当后端连接超时时,ELB会将-1放入其访问日志中的backend_processing_time列 . 想想发生的事情是,您的一些请求需要超过60秒才能处理后端 . 要确认这一点,您可以检查延迟指标吗?查看此指标时请切换到最大值 . 如果您发现延迟频繁达到60秒,它将确认我的猜测 .

    确认后,您可能希望增加ELB和后端的空闲超时 .

相关问题