我正在尝试设置 网络套接字 为了向 发送消息亚马逊 ,因此我可以处理消息并将一些有效负载发送到云中的其他资源,并将自定义响应传递给客户端部分。
但是,我无法让它发挥作用。
主要目标是发送消息到亚马逊通过WSS://
, 第一种方法是 WS://
(如果可能的话),根据负载内容,它应该返回一个自定义响应。如果不需要进一步操作,则关闭连接。
我已经尝试了发布的建议 here , here和 here .但是,要么我缺乏关于 的知识负载均衡 , 网络套接字 , 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/