【发布时间】:2018-03-28 10:19:51
【问题描述】:
我正在尝试设置 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 环境和应用程序是标准创建的,并且还确保平衡器是应用程序,不是经典,因此 应用程序负载平衡器可以与许多来源和文档状态的开箱即用的 Websocket 一起使用。
在 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
感谢您的时间和关注!
亲切的问候, 乔恩 M.
更新 1
我将开始引用@RickBaker:
就个人而言,我首先要做的是从等式中删除负载平衡器。 >如果您的 ec2 实例具有公共 IP,请进入您的安全组并确保 >您的应用正在侦听的正确端口对公众开放。看看你是否至少可以让它在没有负载平衡器复杂化的情况下工作。 – >里克贝克 21 小时前
将 Elastic Beanstalk 环境应用程序的扩展功能从 Load Balancing, Auto Scaling Environment Type 更改为 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
然后我开始搜索 Server to Server 设置找到this docs 和
然后开始挖掘以连接到WSS 服务器。
因此,主要目标是建立并维护从 AWS EB 应用程序到另一个接受 WSS 连接的服务器的会话。 AWS EB 应该负责建立和维护该连接,因此当网络服务器上发生事件时,EB 上的应用程序可以发送对事件发生请求的响应。
然后我读了this topic,并意识到NodeJS - socket.io 方法不会根据阅读的帖子起作用。所以,我不知道现在该怎么办。 ('-')
AWS EB 可以使用Python 和WSGI 设置环境,但是,天啊...不知道下一步该做什么。如果可能,我会尝试连接到WS,如果没有,则连接到WSS,看看是否有什么解决办法。所以我会在得到结果后立即更新,无论结果是肯定的。
乔恩一遍又一遍。
【问题讨论】:
-
虽然不是您问题的直接解决方案。您的方法似乎相当复杂。有什么理由你不能只使用某种类型的 api 端点来实现这一点,还是因为这些可能是长时间运行的进程而使用套接字?
-
嗨@RickBaker!原因是设备应根据发送的有效负载消息(以字节为单位)接收某些自定义响应。该消息由网络服务器服务路由和处理,该服务可以通过多种方式与应用程序服务器通信。似乎符合要求的选项是
HTTP(S)Push 或Websockets。因此,我们正在尝试使用 websockets。我们的主要目标是首先通过WS获得request-response(如果可能(因为AWS 安全措施)),在我们获得@987654357 之后WSS(理想情况下) @ 工作(如果可能,再次)。 -
我明白了。因此,在 AWS 中运行的服务,除了尝试通过 websocket 连接之外,您实际上可以直接连接到端口吗?意思是你从你的 websocket 请求的来源那里远程登录到它?
-
另外,您是否在您的 elb 上启用了代理协议? docs.aws.amazon.com/elasticloadbalancing/latest/classic/…
-
就个人而言,我首先要做的是从等式中删除负载均衡器。如果您的 ec2 实例具有公共 IP,请进入您的安全组并确保您的应用程序正在侦听的正确端口对公众开放。看看你是否至少可以让它在没有负载均衡器复杂化的情况下工作。
标签: node.js amazon-web-services amazon-ec2