2017-10-16 97 views
1

我試圖建立的WebSockets,以便將消息發送到AWS,所以後來我可以處理該消息,並在雲中發送一些有效載荷到其他資源,並提供客戶定製的響應部分。安裝AWS ElasticBeanstalk的使用WebSockets

但是,我不能得到那個工作。

主要目標是通過WSS://將消息發送到AWS,與WS://第一種方式(如果可能的話),這取決於負載的內容,它應返回一個自定義的響應。如果不需要進一步操作,請關閉連接。

我試過了張貼的建議here,herehere。但是,無論是我的知識缺乏有關負載平衡的WebSocketsTCPHTTP是不是讓我看到的解決方案件漏掉的,我所做的一切錯誤或兩者兼而有之。

至於現在,我有一個彈性魔豆例如項目結構是這樣的:

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

彈性魔豆環境和應用程序是標準的創建,並且還確保平衡器應用,不經典,因此應用程序負載平衡器可以使用Websockets開箱即用許多源代碼es和文檔狀態。

它使用端口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 

我只得到504502,有時候,在毫無意義的嘗試隨機調整配置時,它給了我200,而在其他的企圖,沒有協議的錯誤,但像斷線的東西消息..

我感謝您的時間和關注閱讀這個絕望的話題!任何暗示也將不勝感激......只是,任何事情...... T-T

感謝您的時間和關注!

親切的問候, 喬恩·M.

更新1

我會開始引用@RickBaker:

就個人而言,我還能做什麼首先是從刪除負載平衡器等式。 >如果您的ec2實例擁有公共IP,請進入您的安全組並確保>您的應用聽到的正確端口向公衆開放。看看你是否至少可以在沒有負載平衡器複雜化的情況下工作。 - >裏克·貝克22小時前

改變從負載均衡,自動縮放環境類型單實例環境彈性魔豆環境的應用程序的縮放功能。重要的是要知道,我改變了它從彈性魔豆網頁控制檯,而不是直接從EC2,因爲我認爲它可以打破彈性魔豆環境中的應用作爲一個整體。

無論如何,改變了它的環境後,環境的應用程序完成後重新設置,改變和部署如下:

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連接的服務器的會話。應該負責穩定和維護該連接,因此當網絡服務器發生事件時,應用程序可以發送對所發生事件請求的響應。

所以然後我讀了this topic,並意識到NodeJS-socket.io方法將不會工作的基礎上閱讀的職位。所以,我現在不知道該怎麼做。 ( ' - ')

AWS EB可以設置環境PythonWSGI,但吉茲...不知道下一步該怎麼做。如果可能的話,我會嘗試連接WS,如果不是,則嘗試連接WSS,看看是否有問題。所以我會在有結果後立即更新,無論是否存在。

喬恩全身而退。

+0

雖然不是你的問題的直接解決方案。你的方法似乎相當複雜。任何原因,你不能只使用某種類型的API端點來實現這一點,或者你使用套接字,因爲這些可能是長時間運行的進程? –

+0

Hi @RickBaker!原因是設備將根據發送的有效負載消息接收特定的自定義響應,這是以字節爲單位。該消息通過網絡服務器服務進行路由和處理,可以通過多種方式與應用程序服務器通信。似乎符合要求的選項是'HTTP(S)'Push或'Websockets'。所以我們給websockets一個鏡頭。我們的主要目標是首先通過'WS'(如果可能的話(由於** AWS **安全措施)''request'''response','WSS'(理想情況下)在我們獲得'WS'後工作(如果可能,再次)。 – GJntN

+0

我陷入了困境。因此,在AWS內部運行的服務可以在通過websocket連接之外直接連接到端口嗎?意思是你從你的websocket請求來自哪裏的地方進行遠程登錄? –

回答

0

更新2回答&

以前的迭代多帶些文檔閱讀相結合後,才明白,連接確實是從AWS使用ws開始,通過的NodeJS

因此,我可以通過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因爲它沒有被使用。

從這裏開始,現在需要使用發送/接收數據的解決方案。並確保連接已建立/恢復。

非常感謝您的時間和關注!

一切順利! [: