我有一个部署在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 回答
为了将来可以帮助其他人,我在这里发表我的发现:
1)这504 0 HTTP错误主要是因为logrotate重新加载apache而不是正常重启 . 当前AWS配置执行以下操作
所以用
apachectl -k graceful
或/sbin/service httpd graceful
替换服务命令我的ec2实例上的文件位置:
/etc/logrotate.elasticbeanstalk.hourly/logrotate.elasticbeanstalk.httpd.conf
2)因为默认情况下AWS中的logrotate频率太高(每小时一次),至少对于我的用例而言,反过来又是每小时重新加载apache,所以我也减少了它 .
当后端连接超时时,ELB会将-1放入其访问日志中的backend_processing_time列 . 想想发生的事情是,您的一些请求需要超过60秒才能处理后端 . 要确认这一点,您可以检查延迟指标吗?查看此指标时请切换到最大值 . 如果您发现延迟频繁达到60秒,它将确认我的猜测 .
确认后,您可能希望增加ELB和后端的空闲超时 .