我正在尝试设置 Websockets 以便向 AWS 发送消息,因此我可以处理该消息并将一些有效负载发送到云中的其他资源并提供客户部分的自定义响应。
但是,我无法让它发挥作用。
主要目标是通过WSS://
向 AWS 发送消息,首先使用WS://
(如果可能),根据有效负载内容,它将返回自定义响应。如果不需要进一步操作,则关闭连接。
我已尝试发布here,here和here的建议。但是,要么我缺乏负载平衡, Websockets , TCP 和 HTTP 的知识,请不要让我看到件解决方案缺失,我做错了或两者兼而有之。
就目前而言,我有一个 Elastic Beanstalk 示例项目结构,如下所示:
+ nodejs-v1
|--+ .ebextensions
| |--- socketupgrade.config
|
|--+ .elasticbeasntalk
| |--- config.yaml
|
|--- .gitignore
|--- app.js
|--- cron.yaml
|--- index.html
|--- package.json
Elastic Beanstalk环境和应用程序是标准创建的,并且还确保Balancer是应用程序,不是经典,因此 应用程序加载正如许多来源和文档所述,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次,在其他尝试时,没有协议错误,但是会有断开连接等消息。 ..
感谢您抽出时间和精力阅读这个绝望的主题!任何暗示也将受到赞赏......只是,任何事情...... T-T
感谢您的时间和关注!
亲切的问候, Jon M。
我将开始引用@RickBaker:
就个人而言,我首先要做的是从等式中移除负载平衡器。 &gt;如果您的ec2实例有公共IP,请进入您的安全组并确保&gt;您的应用正在收听的正确端口向公众开放。并且看看你是否能够在没有负载均衡器的情况下使其工作至少变得复杂。 - &gt; Rick Baker 21小时前
将 Elastic Beanstalk 环境的应用程序的扩展功能从 负载平衡,Auto Scaling环境类型 更改为 Single实例环境 。重要的是,我从 Elastic Beanstalk 网页控制台更改了它,而不是直接从 EC2 更改它,因为我认为它可以打破 Elastic Beanstalk 环境应用整体。
无论如何,在环境和环境的应用程序再次完成设置后,更改了它,更改并部署了以下内容:
index.html
:
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io();
</script>
一切运行后,通过网页呼叫测试到索引页面。节点中的日志显示生命:
-------------------------------------
/var/log/nodejs/nodejs.log
-------------------------------------
Listening on 8081
Client connected
Client disconnected
Client connected
然后我开始搜索服务器到服务器设置找到this文档和
然后开始挖掘一点,以便连接到WSS
服务器。
因此,主要目标是建立并保持从 AWS EB 应用程序到另一台接受WSS
连接的服务器的会话。 AWS EB 应该负责维护和保留该连接,因此当网络服务器发生事件时, EB 处的应用程序可以发送对发生事件请求的响应。 / p>
然后我读了this topic,并意识到NodeJS
- socket.io
方法根据阅读的帖子不起作用。所以,我现在不知道该怎么做。 (' - ')
AWS EB 可以使用Python
WSGI
来设置环境,但是,geez ...不知道接下来该做什么。如果可能,我会尝试连接到WS
,如果不是WSS
,请查看是否有问题。所以我会在得到结果后立即更新,无论是否正确。
乔恩一遍又一遍。
答案 0 :(得分:0)
在将之前的迭代与更多文档阅读相结合后,我开始意识到,连接确实从 AWS 开始,通过 NodeJS 使用ws
。< / p>
因此,我可以通过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
,因为它没有被使用。
从这里开始,现在由解决方案要求使用发送/接收数据。并确保建立/恢复连接。