如何排查 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 有一个 HTTPS/443 侦听器,其证书对
mydomain.com
、app1.mydomain.com
、app2.mydomain.com
、app2.mydomain.com
.[=57 有效=]
- 侦听器有 3 条规则,加上默认规则:
- 主机 ==
app1.mydomain.com
=> app1-target-group
- 主机 ==
app2.mydomain.com
=> app2-target-group
- 主机 ==
app3.mydomain.com
=> app3-target-group
- 默认操作(不得已)=>
default-target-group
- 每个目标组仅包含一个 EC2 实例,通过 HTTP,具有以下端口:
app1-target-group
: 3000
app2-target-group
: 3001
app3-target-group
: 3002
default-target-group
: 3000
鉴于我可以直接访问该应用程序,我确定这一定是我配置 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。
我有一个 EC2 实例,上面成功部署了一些应用程序,监听端口 3000/3001/3002 上的连接。我可以通过在给定端口上连接到其 public DNS 或 public IP 来正确加载网页。 IE。 curl http://<ec2-ip-address>:3000
有效。所以我知道应用程序是 运行,并且我知道端口 bindings/firewall rules/EC2 安全组都已正确设置以接收来自外界的连接。
我还有一个应用程序负载均衡器,它应该根据主机名将流量路由到 3 个应用程序,但它总是给我“504 网关超时”。我已经检查了所有设置,但看不出哪里出了问题,而且我不确定如何从这里进行故障排除。
- ALB 有一个 HTTPS/443 侦听器,其证书对
mydomain.com
、app1.mydomain.com
、app2.mydomain.com
、app2.mydomain.com
.[=57 有效=] - 侦听器有 3 条规则,加上默认规则:
- 主机 ==
app1.mydomain.com
=>app1-target-group
- 主机 ==
app2.mydomain.com
=>app2-target-group
- 主机 ==
app3.mydomain.com
=>app3-target-group
- 默认操作(不得已)=>
default-target-group
- 主机 ==
- 每个目标组仅包含一个 EC2 实例,通过 HTTP,具有以下端口:
app1-target-group
: 3000app2-target-group
: 3001app3-target-group
: 3002default-target-group
: 3000
鉴于我可以直接访问该应用程序,我确定这一定是我配置 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。