如何排查 AWS Application Load Balancer 给出 504,而它后面的 EC2 实例给出 200?

How can I troubleshoot an AWS Application Load Balancer giving 504, while the EC2 instance behind it gives 200?

我有一个 EC2 实例,上面成功部署了一些应用程序,监听端口 3000/3001/3002 上的连接。我可以通过在给定端口上连接到其 public DNS 或 public IP 来正确加载网页。 IE。 curl http://<ec2-ip-address>:3000 有效。所以我知道应用程序是 运行,并且我知道端口 bindings/firewall rules/EC2 安全组都已正确设置以接收来自外界的连接。

我还有一个应用程序负载均衡器,它应该根据主机名将流量路由到 3 个应用程序,但它总是给我“504 网关超时”。我已经检查了所有设置,但看不出哪里出了问题,而且我不确定如何从这里进行故障排除。

鉴于我可以直接访问该应用程序,我确定这一定是我配置 ALB/listener/target 组的方式有问题。但是 504 并没有让我继续下去。

我尝试打开对 S3 存储桶的访问日志,但它似乎没有在其中写入任何内容。有一个名为 ELBAccessLogTestFile 的对象,存储桶中没有实际日志。

编辑:更多信息...我实际上在 EC2 实例上安装了 nginx,这是我之前进行 SSL 终止和主机名到端口 mapping/routing 的地方。如果我将上面的 default-target-group 更改为通过 HTTPS 指向端口 443,那么它就可以工作了!

所以出于某种原因,路由流量 - 通过端口 443 上的 HTTPS 从 ALB 到 EC2 实例 -> OK! - 在端口 3000 上通过 HTTP 从 ALB 到 EC2 实例 -> 损坏!

但是,我 可以 从我的笔记本电脑直接在 HTTP/3000 上点击实例。

同一安全组内的资源之间的通信默认是不开放的。单独的安全组成员资格不提供特殊访问。您仍然需要打开安全组中的端口,以允许安全组中的其他资源访问这些端口。如果您不想超出安全组中的资源开放,您可以在规则的源字段中指定安全组ID。