[英]Setup of AWS ElasticBeanstalk with Websockets
我正在嘗試設置Websockets以便將消息發送到AWS ,因此我可以處理消息並將一些有效負載發送到雲中的其他資源,並將自定義響應傳遞給客戶端。
但是,我無法解決這個問題。
主要目標是通過WSS://
(使用WS://
第一種方法)將消息發送到AWS (在可能的情況下),具體取決於負載內容,它將返回自定義響應。 如果不需要進一步的操作,則關閉連接。
我已經嘗試過這里 , 這里和這里發布的建議。 但是,或者由於我對負載平衡 , 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是application , 而不是classic ,因此Application Load Balancer可以與Websockets一起使用許多源和文檔狀態。
使用HTTP在端口80上進行設置。粘性啟用了一天。
這是使用的代碼:
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,而在其他的企圖,沒有協議的錯誤,但像斷線的東西消息...
感謝您的時間和精力閱讀這個絕望的話題! 任何提示也將不勝感激...隨便什么... TT
感謝您的時間和關注!
親切的問候,喬恩·M。
我將開始引用@RickBaker:
就個人而言,我首先要做的是從等式中刪除負載均衡器。 >如果您的ec2實例具有公共ip,請進入安全組,並確保>您的應用程序正在偵聽的正確端口對公眾開放。 並查看您是否至少可以在不使負載均衡器使事情復雜化的情況下使其運行。 –> Rick Baker 21小時前
將Elastic Beanstalk環境的應用程序的縮放功能從“ 負載平衡,自動縮放環境類型”更改為“ 單實例環境” 。 重要的是要知道,我是從Elastic Beanstalk Web控制台更改了它,而不是直接從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
然后,我開始搜索發現此文檔的“ 服務器到服務器”安裝程序,然后開始進行挖掘以連接到WSS
服務器。
因此,主要目標是建立和維護從AWS EB應用程序到另一台接受WSS
連接的服務器的會話。 AWS EB應該負責穩定並維持該連接,因此,當網絡服務器上發生事件時, EB上的應用程序可以將響應發送給事件發生。
所以后來我看了這個題目 ,並意識到NodeJS
- socket.io
的做法是行不通的基礎上,帖子讀取。 所以,我不知道該怎么辦。 ('-')
AWS EB可以使用帶有WSGI
Python
來設置環境,但是,伙計...不知道下一步該怎么做。 如果可能,我將嘗試一些事情以便連接到WS
,如果不能,則嘗試WSS
,然后看看是否有效果。 因此,無論結果是否正確,我都會在獲得結果后立即進行更新。
喬恩一遍又一遍。
在將先前的迭代與更多的文檔閱讀相結合之后,我意識到,連接的確確實是通過AWS通過使用ws
NodeJS從AWS開始的。
因此,我能夠通過WSS
與Network Server進行通信,並請求並提供數據。
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
,所以沒有。
從這里開始,現在取決於解決方案要求的發送/接收數據的用法。 並確保建立/恢復連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.