AWS Elastic Beanstalk 上的 Dockerized 节点。错误 502 BadGateway

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 上的 Dockerized 节点。错误 502 BadGateway【英文标题】:Dockerized Node on AWS Elastic Beanstalk. Error 502 BadGateway 【发布时间】:2019-04-03 22:17:59 【问题描述】:

我有一个 Node 应用程序(Isomorphic React 应用程序)dockerized 并部署到 AWS Elastic Beanstalk。我有以下所有信息,但如果你想要一个 tldr:如何在 AWS Elastic Beanstalk 中配置主机和容器之间的端口转发,即 5000:3000?

我希望我的应用程序像这样工作(数字是端口):

End User --80--> EC2 Instance / nginx --5000--> Container --3000--> Application 

我使用 Dockerfile 来公开 5000。我知道这只是一个建议,但据我所知,亚马逊使用它来公开 docker 容器中的端口,而不是 docker-compose.yml。应用在 3000 端口上运行。节点中的代码在 3000 端口上运行:

process.env.PORT || 3000

尝试使用端口 80 访问站点时,我收到 502 Bad Gateway 错误。

我通过 SSH 连接到托管我的 docker 容器的 EC2 实例。 elasticbeanstalk 的 nginx 配置如下所示:

upstream docker 
    server [CONTAINER_IP]:5000;
    keepalive 256;

IP 是容器的正确 IP(我使用 Docker Inspect 检查过)。当我跑步时:sudo docker ps -a

我明白了:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    REDACTED        REDACTED        "node server.js"    34 hours ago        Up 34 hours         5000/tcp            jolly_williams

如果我在 EC2 主机实例上运行 netstat,我会看到端口 80 已打开:

tcp        0      0 0.0.0.0:80

当我查看 EC2 主机实例上的日志时,我多次看到不同资源的此错误:

请求:“GET / HTTP/1.1”,上游:“http://[CONTAINER_IP]:5000/”,主机:[Beanstalk URL] 连接被拒绝

现在是踢球器,它在我运行时起作用:

sudo curl [ContainerIP]:3000 (from the EC2 host intance)

-或-

sudo docker exec -ti [CONTAINER_NAME] curl http://localhost:3000

有人知道为什么节点运行 3000 而不是 5000 吗?我能做什么?

【问题讨论】:

您不应该需要一个 Dockerrun.aws.json 文件吗? Multicontainer Docker Configuration 特别是以下部分:"portMappings": [ "hostPort": 80, "containerPort": 80 感谢您的回复!这就是我的想法,但我向亚马逊提交了一张票,他们提到我不需要 Dockerrun.aws.json 文件来进行单个 docker 配置。我上传了一个 Dockerrun.aws.json 文件,其中容器端口为 3000,主机端口为 5000,但我仍然得到 502。在我的本地 docker compose 中,端口为:5000:3000 我认为您应该将主机端口设置为 80,将容器端口设置为 5000... 因为节点运行在 3000... 我认为这是正确的映射。您的 ec2 实例是否接受来自公共端口 80 的流量......我想它会,但有时如果我对配置做了一些时髦的事情,我会遇到这个问题......如果 3000 有效,我会将所有内容设置为 3000,看看是否你可以从那里击打东西并向后工作。 @MrCunninghamz 我添加了这个,但仍然收到 502 错误: "AWSEBDockerrunVersion": "1", "Ports": [ "HostPort": "80", "ContainerPort": "5000" ] 【参考方案1】:

与 AWS 支持人员交谈。他们说 docker 端口必须与应用程序正在侦听的端口相同,即没有端口映射

【讨论】:

以上是关于AWS Elastic Beanstalk 上的 Dockerized 节点。错误 502 BadGateway的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 AWS Elastic Beanstalk 上的 TooManyApplicationVersion 异常?

反应:AWS Elastic Beanstalk 上的 502 错误网关

AWS Elastic Beanstalk 上的 Wordpress

AWS Elastic Beanstalk 上的 Spring Boot 并记录到文件

AWS Elastic Beanstalk 上的 Django manage.py

如何获取命令以从 Elastic Beanstalk 上的 Dockerfile.aws.json 运行?