使用Websockets设置AWS ElasticBean

我正在尝试设置Websockets以便将消息发送到AWS ,以便我可以处理消息并将一些有效内容发送到云中的其他资源,并向客户端部分提供自定义响应。

但是,我无法得到这个工作。

主要目标是通过WSS://WS://发送消息, WSS://根据有效负载内容使用WS:// (如果可能的话)的第一种方法,它将返回自定义响应。 然后closures连接,如果不需要进一步的操作。

我已经尝试了这里和这里张贴的build议。 但是,或者我对负载平衡WebsocketsTCPHTTP的了解不够,我不能看到一些解决scheme的缺失,我做的一切都是错误的,或者两者兼而有之。

至于现在,我有一个像这样的Elastic Beanstalk示例项目结构:

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

Elastic Beanstalk环境和应用程序是标准创build的,并且还确保了Balancer是应用程序而不是经典的 ,因此Application Load 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 ,有时候,随意调整configuration随机在毫无意义的尝试,它给了我200和其他尝试,没有协议错误,但消息,如断开连接和东西…

感谢您阅读这个绝望话题的时间和精力! 任何暗示也将被赞赏…只是,任何东西… TT

感谢您的时间和关注!

亲切的问候,Jon M.

更新1

我会开始引用@RickBaker:

就个人而言,我首先要做的是从等式中移除负载平衡器。 >如果你的ec2实例有一个公共ip,进入你的安全组,并确保>你的应用正在听的正确的端口是公开的。 看看你是否至less可以在没有负载平衡器的情况下工作。 – >里克·贝克21小时前

Elastic Beanstalk环境的应用程序的缩放function从负载平衡,Auto Scaling环境types更改为单实例环境 。 重要的是要知道,我从Elastic Beanstalk网页控制台,而不是从EC2直接,因为我认为它可以打破整个Elastic Beanstalk环境应用程序。

无论如何,改变它,环境和环境的应用程序完成设置后,改变和部署如下:

index.html

 <script src="/socket.io/socket.io.js"></script> <script> var socket = io(); </script> 

一切运行后,通过网页调用通过网页索引页面进行testing。 来自节点的日志显示了生命:

 ------------------------------------- /var/log/nodejs/nodejs.log ------------------------------------- Listening on 8081 Client connected Client disconnected Client connected 

然后,我开始search服务器到服务器安装程序,发现这个文档,然后开始挖了一下,以连接到WSS服务器。

所以,主要目标是build立并维护从AWS EB应用程序到另一个接受WSS连接的服务器的会话。 AWS EB应该负责稳定和维护这个连接,所以当Network Server发生事件时, EB上的应用程序可以响应事件发生的请求。

然后我读了这个主题 ,并且意识到NodeJSsocket.io方法根据读取的post不会工作。 所以,我现在不知道该怎么做。 (' – ')

AWS EB可以通过使用WSGI Python来设置环境,但是,geez …不知道下一步该怎么做。 如果可能的话,我会尝试一些东西来连接到WS ,如果没有,那么WSS ,看看是否有东西出现。 所以我会在有结果后立即更新,无论是否正式。

乔恩一遍又一遍。

更新2和答案

在将以前的迭代与一些更多的文档读取结合起来之后,才意识到,连接的确是从AWS开始的,通过使用ws NodeJS开始的。

所以我可以通过WSS与networking服务器进行通信并请求和提供数据。

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因为它没有被使用。

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

非常感谢您的时间和关注!

祝一切顺利! [: