亚马逊 beanstalk tcp 应用程序没有响应

amazon beanstalk tcp app not responding

我正在 运行在我的 aws linux ec2 实例上安装一个 nodejs tcp 应用程序。基本代码如下

var net = require('net');
net.createServer(function(socket){
socket.write('hello\n');

socket.on('data', function(data){
    socket.write(data.toString().toUpperCase())
  });
}).listen(8080);

和它的 运行 一样的魅力,但我想 运行 在 aws beanstalk 上使用同样的应用程序(只是为了获得自动缩放的好处)。是的,我不是 AWS 忍者。顺便说一句,我使用 aws VPC 在 beantalk 获取 public ip。

  1. beanstalk 应用程序连接到 VPC = 选中。
  2. VPC 8080 端口打开 = 选中。
  3. 将硬编码端口 8080 更改为 process.env.PORT = 选中。

但是如果我在端口 8080 ping 任何东西,它不会从应用程序 return 'hello'。我缺少什么?

您的应用程序未实现 HTTP。 ElasticBeanstalk 默认情况下会将弹性负载均衡器 (ELB) 配置为充当 HTTP 负载均衡器。这意味着您的实例不健康,没有被 ELB 投入使用,ELB 本身也会拒绝 non-HTTP 请求。

重要说明: 虽然可以修改 ElasticBeanstalk 使其适用于您的用例,但您将在 non-standard 这样的方式会有一定的风险。如果您经常使用 CloudFormation 或 API 创建和删除环境,那么您可能 运行 会很头疼。

如果您只打算创建一个环境并将其保留 运行ning,那么我建议您执行以下步骤。

首先,ElasticBeanstalk 的 nodejs 配置将在 EC2 实例上配置 Nginx 服务器,因为您使用的是 TCP,所以您将希望完全绕过它。这可以由 re-configuring ELB 和安全组来完成。留下 Nginx 最简单 运行ning,它只是不会被使用,只要确保它与 nodejs 不在同一个端口即可。

默认情况下,ELB 配置如下所示:

您错过的步骤是更新 ELB 以在适当的端口上使用 TCP 负载平衡。您可以进入 Load Balancers 下的 EC2 Web 控制台,并将已创建的 Beanstalk 的负载均衡器配置更新为如下所示:

您还需要将负载均衡器的健康检查修改为在正确的端口上:

最后,仔细检查以确保负载均衡器和 EC2 实例的安全组允许访问适当的端口。最后要检查的是您的 VPC 的 NACL 也允许访问适当的端口,但您已经提到您看过了。