node.js - 亚马逊 beanstalk tcp 应用程序没有响应

标签 node.js amazon-web-services tcp amazon-elastic-beanstalk amazon-vpc

我正在我的 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 = checked。

但是如果我在端口 8080 ping 任何东西,它不会从应用程序返回“你好”。我错过了什么?

最佳答案

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

重要说明: 虽然可以修改 ElasticBeanstalk 使其适用于您的用例,但您将以非标准方式使用它,因此会存在一些风险.如果您经常使用 CloudFormation 或 API 创建和删除环境,那么您可能会遇到很多麻烦事。

如果您只想创建一个环境并让它运行,那么我建议您执行以下步骤。

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

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

Standard ELB Configuration for nodejs Beanstalk Application

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

TCP Configuration for nodejs Beanstalk App

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

enter image description here

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

关于node.js - 亚马逊 beanstalk tcp 应用程序没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34509075/

相关文章:

python - AWS Lambda 无法 ping VPC 中的 EC2 实例

amazon-web-services - AWS Auto Scaling 组 - 每个目标的应用程序负载均衡器请求计数

TCP 缓冲区大小和以太网绑定(bind)

http - HTTP请求中不同的TCP连接是如何识别的?

linux - JMeter-服务器在开始测试后卡住

node.js - LetsEncrypt 适用于 IP 但不适用于域(greenlock,express)

node.js - 从 JSON 文件读取并解析原始数据

macos - 如何找到旧版本的 Node ?

python - 你如何使用带 stunnel 的 Python 套接字?

angularjs - 我想创建一个路由,以在用户登录时自动将用户重定向到主页