6

我对我的应用程序进行了码头化。如果我用 docker run 运行它,evertything 工作正常。我尝试使用 ecs fargate 运行它并在它前面放置一个 ALB。如果我尝试通过 ALB dns 访问我的应用程序,我会得到一个 504 Gateway Teme-out。

在搜索解决方案时,我发现了一个帖子,它告诉我将 Tomcat 超时设置为高于 ELB 超时,但它没有帮助。

Dockerfile

FROM tomcat:8.0.20-jre8
RUN sed -i 's/connectionTimeout="20000"/connectionTimeout="70000"/' /usr/local/tomcat/conf/server.xml
CMD ["catalina.sh","run"]
COPY /target/Webshop.war /usr/local/tomcat/webapps/

负载均衡日志

http 2019-09-11T11:20:50.585293Z app/Doces-Backe-19RQJLVNHYG2P/8fb4f4079bb6ff9f 66.85.6.136:47767 - -1 -1 -1 503 - 18 348 "GET http://:8080/ HTTP/1.0" "-" - - arn:aws:elasticloadbalancing:eu-central-1:573575081005:targetgroup/ecs-Docest-de-webshop/8df4f0978484f8bd "Root=1-5d78d892-58886d3490906f0fa3914563" "-" "-" 0 2019-09-11T11:20:50.462000Z "forward" "-" "-"
http 2019-09-11T11:23:23.535869Z app/Doces-Backe-19RQJLVNHYG2P/8fb4f4079bb6ff9f 66.85.6.136:50950 10.10.11.140:8080 -1 -1 -1 504 - 18 303 "GET http://:8080/ HTTP/1.0" "-" - - arn:aws:elasticloadbalancing:eu-central-1:573575081005:targetgroup/ecs-Docest-de-webshop/8df4f0978484f8bd "Root=1-5d78d921-a236121716bd1bd209625fd8" "-" "-" 0 2019-09-11T11:23:13.415000Z "forward" "-" "-"
http 2019-09-11T11:23:56.286426Z app/Doces-Backe-19RQJLVNHYG2P/8fb4f4079bb6ff9f 66.85.6.136:51658 10.10.11.140:8080 -1 -1 -1 504 - 18 303 "GET http://:8080/ HTTP/1.0" "-" - - arn:aws:elasticloadbalancing:eu-central-1:573575081005:targetgroup/ecs-Docest-de-webshop/8df4f0978484f8bd "Root=1-5d78d942-22a1680464884762e02ec940" "-" "-" 0 2019-09-11T11:23:46.156000Z "forward" "-" "-"
http 2019-09-11T11:23:27.513803Z app/Doces-Backe-19RQJLVNHYG2P/8fb4f4079bb6ff9f 66.85.6.136:51034 10.10.11.140:8080 -1 -1 -1 504 - 18 303 "GET http://:8080/ HTTP/1.0" "-" - - arn:aws:elasticloadbalancing:eu-central-1:573575081005:targetgroup/ecs-Docest-de-webshop/8df4f0978484f8bd "Root=1-5d78d925-b6b5daf0d0f733140aea0f84" "-" "-" 0 2019-09-11T11:23:17.393000Z "forward" "-" "-"

我希望看到我的应用程序在 elb 上运行。

谢谢你的帮助!

4

2 回答 2

5

解决方案:

问题是我在负载均衡器的安全组中设置了正确的端口,但在 ECS 服务的安全组中没有。所以我在那里打开了所需的端口,现在它可以工作了。

程序:

  1. 转到您的集群
  2. 去有问题的服务
  3. 单击网络访问项下的安全组并打开所需的端口

谢谢!

于 2020-08-06T10:33:29.990 回答
3

背后可能有多种原因gateway timeout。我唯一不喜欢法盖特的是debug-log。@AWS 团队应该默认启用 Fargate 服务的日志配置,因为没有日志很难调试这些问题。

最好配置日志驱动程序并将日志推送到云手表并查看实际问题,还要仔细检查任务定义中所需的端口和服务中的映射端口。

            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-group": "awslogs-spring",
                    "awslogs-region": "us-west-2",
                    "awslogs-stream-prefix": "awslogs-example"
                }

或从 AWS 控制台

在此处输入图像描述 您需要将云监视日志的权限或角色分配给任务定义或服务,以将日志推送到云监视。

配置日志后,转到cloudwatch日志组并搜索日志组,以便您深入了解您的应用程序。

但是,要首先解决实际问题,您必须了解错误代码和可能的原因Gateway Timeout

HTTP 504:网关超时

说明:表示负载均衡器关闭了连接,因为请求未在空闲超时期限内完成。

原因1:应用程序响应时间比配置的空闲超时时间长。

解决方案 1:监控 HTTPCode_ELB_5XX 和延迟指标。如果这些指标有所增加,则可能是由于应用程序在空闲超时期限内没有响应。有关超时请求的详细信息,请在负载均衡器上启用访问日志并查看 Elastic Load Balancing 生成的日志中的 504 响应代码。如有必要,您可以增加容量或增加配置的空闲超时,以便完成冗长的操作(例如上传大文件)。有关更多信息,请参阅为您的 Classic Load Balancer 配置空闲连接超时和如何对 Elastic Load Balancing 高延迟进行故障排除。

原因 2:已注册实例关闭与 Elastic Load Balancing 的连接。

解决方案 2:在您的 EC2 实例上启用 keep-alive 设置,并确保 keep-alive 超时大于负载均衡器的空闲超时设置。

于 2019-09-11T12:36:12.723 回答