node.js - 使用 Websocket 设置 AWS ElasticBeanstalk

标签 node.js amazon-web-services amazon-ec2

我正在尝试设置 网络套接字 为了向 发送消息亚马逊 ,因此我可以处理消息并将一些有效负载发送到云中的其他资源,并将自定义响应传递给客户端部分。

但是,我无法让它发挥作用。

主要目标是发送消息到亚马逊通过WSS:// , 第一种方法是 WS:// (如果可能的话),根据负载内容,它应该返回一个自定义响应。如果不需要进一步操作,则关闭连接。

我已经尝试了发布的建议 here , herehere .但是,要么我缺乏关于 的知识负载均衡 , 网络套接字 , TCP HTTP 不是让我看到缺少的解决方案,我做错了一切或两者兼而有之。

至于现在,我有一个 弹力 bean 茎 示例项目结构如下:

+ nodejs-v1
|--+ .ebextensions
|  |--- socketupgrade.config
|
|--+ .elasticbeasntalk
|  |--- config.yaml
|
|--- .gitignore
|--- app.js
|--- cron.yaml
|--- index.html
|--- package.json

Elastic Beanstalk 环境和应用程序是标准创建的,并且还确保 Balancer 是 申请 , 不经典 ,因此 应用负载均衡器 可以开箱即用地使用 Websockets,因为它有许多源和文档状态。

它在端口 80 上使用 HTTP 设置。粘性启用了一天。

这是正在使用的代码:
app.js :
'use strict';

const express = require('express');
const socketIO = require('socket.io');
const path = require('path');

const PORT = process.env.PORT || 3000;
const INDEX = path.join(__dirname, 'index.html');

const serber = express()
  .use((req, res) => res.sendFile(INDEX) )
  .listen(PORT, () => console.log(`Listening on ${ PORT }`));

const io = socketIO(serber);

io.on('connection', (socket) => {
  console.log('Client connected');
  socket.on('disconnect', () => console.log('Client disconnected'));
});

setInterval(() => io.emit('time', new Date().toTimeString()), 1000);
index.html :
<script src="/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://localhost');
  socket.on('news', function (data) {
    console.log(data);
  });
</script>
package.json :
{
  "name": "Elastic-Beanstalk-Sample-App",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express":"*",
    "socket.io":"*"
    },
  "scripts": {
    "start": "node app.js"
  }
}
.ebextensions/socketupgrade.config :
container_commands:
  enable_websockets:
    command: |
     sed -i '/\s*proxy_set_header\s*Connection/c \
              proxy_set_header Upgrade $http_upgrade;\
              proxy_set_header Connection "upgrade";\
      ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

我只收到 504 , 502 ,有时,在毫无意义的尝试中随机调整配置时,它给了我 200 次尝试,而在其他尝试中,没有协议(protocol)错误,但是诸如断开连接之类的消息......

感谢您花时间和精力阅读这个绝望的话题!任何提示也将不胜感激......只是,任何东西...... T-T

感谢您的时间和关注!

亲切的问候,
乔恩·M。

更新 1

我将开始引用@RickBaker:

Personally, what I would do first is remove the load balancer from the equation. >If your ec2 instance has a public ip, go into your security groups and make sure >the proper port your app is listening to is open to the public. And see if you >can at least get it working without the load balancer complicating things. – >Rick Baker 21 hours ago



将 Elastic Beanstalk 环境应用程序的缩放功能从 更改为负载均衡、Auto Scaling 环境类型 单实例环境 .重要的是要知道,我是从 Elastic Beanstalk 网页控制台而不是直接从 EC2 更改它的,因为我认为它会破坏整个 Elastic Beanstalk 环境应用程序。

反正改了,环境和环境的应用重新设置完后,改部署如下:
index.html :
<script src="/socket.io/socket.io.js"></script>
<script>
    var socket = io();
</script>

一切运行后,通过网页调用索引页面进行测试。来自 Node 的日志显示了生命:
-------------------------------------
/var/log/nodejs/nodejs.log
-------------------------------------
Listening on 8081
Client connected
Client disconnected
Client connected

然后我开始搜索 Server to Server setup 发现 this文档和
然后开始挖掘一下以连接到 WSS服务器。

因此,主要目标是稳定和维护来自 的 session AWS EB 应用到另一个接受 WSS 的服务器连接。 AWS EB 应该负责建立和维护该连接,因此当网络服务器发生事件时,位于 的应用程序EB 可以对发生的事件的请求发送响应。

于是我读了this topic ,并意识到 NodeJS - socket.io根据阅读的帖子,方法将不起作用。所以,我不知道现在该怎么办。 ('-')

AWS EB 可以使用 Python 设置环境与 WSGI但是,天啊...不知道下一步该做什么。我会尝试连接到 WS如果可能,如果没有,那么 WSS ,看看有没有什么问题。所以我会在我得到结果后立即更新,无论是否积极。

乔恩一遍又一遍。

最佳答案

在结合之前的迭代和更多的文档阅读后,我意识到,连接确实是从 开始的。亚马逊 , 通过 NodeJS 使用 ws .

所以我可以通过 WSS 与网络服务器通信并请求和提供数据。
app.js :

var WebSocket = require('ws');
var wss = new WebSocket('wss://example.com');

wss.on('open', function connection() {
    console.log("WSS connection opening")
});

wss.on('message', function incoming(data) {
    console.log("Jot:")
    console.log(data)
    setTimeout(function timeout() {
        console.log("Sending response")
        wss.send(JSON.stringify(
            {
                "key": "Hi there"
            }
            ));
        }, 
    500);
});
package.json :
{
  "name": "Elastic-Beanstalk-Sample-App",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "express":"*",
    "socket.io":"*",
    "ws": "*"
    },
  "scripts": {
    "start": "node app.js"
  }
}

项目的结构几乎保持不变:
+ nodejs-v1
|--+ .ebextensions
|  |--- socketupgrade.config
|
|--+ .elasticbeasntalk
|  |--- config.yaml
|
|--- .gitignore
|--- app.js
|--- cron.yaml
|--- package.json

如您所见,没有index.html因为它没有被使用。

从这里开始,现在取决于解决方案要求发送/接收数据的使用。并确保建立/恢复连接。

关于node.js - 使用 Websocket 设置 AWS ElasticBeanstalk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46778036/

相关文章:

javascript - Nodejs 'res is not defined' 内需要

node.js - 使用 sequelize 在 nodejs 中创建 "dynamic query"?

css - 将样式组件与从 node_module 导入的 CSS 文件一起使用

AWS EC2 Linux AMI 上的 R & RStudio 安装 - R 的最新版本

PHP 扩展目录与 YUM

linux - 即使系统时区是 IST, Play Framework 日志也采用 UTC

linux - AWS EC2 SSH 生命周期短暂

node.js - 使用 MongoDB 进行数据分区

amazon-web-services - 在部署中找不到构建规范文件?

amazon-web-services - AWS cloudformation可选线