我正在我的 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。
- beanstalk 应用程序连接到 VPC = 选中。
- VPC 8080 端口打开 = 选中。
- 将硬编码端口 8080 更改为 process.env.PORT = checked。
但是如果我在端口 8080 ping 任何东西,它不会从应用程序返回“你好”。我错过了什么?
最佳答案
您的应用程序未实现 HTTP。 ElasticBeanstalk 默认情况下会将弹性负载均衡器 (ELB) 配置为充当 HTTP 负载均衡器。这意味着您的实例不健康,没有被 ELB 投入使用,ELB 本身也会拒绝非 HTTP 请求。
重要说明: 虽然可以修改 ElasticBeanstalk 使其适用于您的用例,但您将以非标准方式使用它,因此会存在一些风险.如果您经常使用 CloudFormation 或 API 创建和删除环境,那么您可能会遇到很多麻烦事。
如果您只想创建一个环境并让它运行,那么我建议您执行以下步骤。
首先,ElasticBeanstalk 的 nodejs 配置将在 EC2 实例上配置 Nginx 服务器,因为您使用的是 TCP,所以您将希望完全绕过它。这可以通过重新配置 ELB 和安全组来完成。让 Nginx 保持运行是最简单的,它不会被使用,只要确保它不在与 nodejs 相同的端口上即可。
默认情况下,ELB 配置如下所示:
您错过的步骤是更新 ELB 以在适当的端口上使用 TCP 负载平衡。您可以进入 Load Balancers 下的 EC2 Web 控制台,并将已创建的 Beanstalk 的负载均衡器配置更新为如下所示:
您还需要将负载均衡器的健康检查修改为在正确的端口上:
最后,仔细检查以确保负载均衡器和 EC2 实例的安全组允许访问适当的端口。最后要检查的是您的 VPC 的 NACL 也允许访问适当的端口,但您已经提到您看过了。
关于node.js - 亚马逊 beanstalk tcp 应用程序没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34509075/