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

时间:2016-05-17 15:27:34

标签: amazon-web-services amazon-ec2 amazon-elb

我有一个部署在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 :(得分:6)

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

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,所以我也减少了它。

答案 1 :(得分:0)

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

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