使用AWS ECS运行图像会抛出504网关超时

时间:2019-09-11 11:34:26

标签: spring amazon-web-services docker tomcat

我对我的应用程序进行了docker化。如果我用docker run来运行它,那么一切都很好。 我尝试使用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/

ELB日志

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上运行。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

gateway timeout背后可能有多种原因。我对Fargate唯一不满意的是debug-log。 @AWS小组应默认启用Fargate服务的日志配置,因为它很难调试没有日志的问题。

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

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

或通过AWS控制台

enter image description here 您需要为任务定义或服务分配Cloud Watch日志的权限或角色,以将日志推送到Cloud Watch。

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

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

HTTP 504:网关超时

描述:指示负载平衡器由于在空闲超时时间内未完成请求而关闭了连接。

原因1:与配置的空闲超时相比,应用程序需要更长的响应时间。

  

解决方案1:监视HTTPCode_ELB_5XX和Latency指标。如果有   这些指标有所增加,可能是由于应用程序   在空闲超时时间内没有响应。有关的详细信息   超时的请求,在负载均衡器上启用访问日志   并查看由生成的日志中的504个响应代码   弹性负载平衡。如有必要,可以增加容量   或增加配置的空闲超时时间,以便进行长时间的操作   (例如上传大文件)即可完成。了解更多信息,   请参阅为经典负载配置空闲连接超时   平衡器以及如何解决弹性负载平衡过高的问题   延迟。

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

  

解决方案2:在EC2实例上启用保持活动设置并进行   确保保持活动超时大于空闲超时   负载均衡器的设置。

答案 1 :(得分:0)

解决方案:

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

过程:

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

谢谢!