ELB 返回 HTTP 504 错误,即使主机健康且能够处理请求

HTTP 504 errors returned by ELB even when hosts are healthy and able to serve request

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

问题是,即使 traffic/load 不是太高,但我仍然经常从 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 returned 的情况远远少于 504)甚至后端是 returning 一个 504,然后 ELB 将其转发给客户端。据我所知,仅当后端超时时,HTTP 504 才应由代理 return 编辑。服务器本身怎么能return一个504?

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

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

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

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