我有一个部署在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?答案 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和后端的空闲超时。