2

我有一臺在AWS EC2 Autoscale集羣上運行的Akka HTTP服務器。此EC2自動縮放羣集在前面有一個ELB應用程序負載均衡器。除了ELB之外,我們還有一個雲端分佈,用於提供靜態文件。如何在AWS Cloudfront上啓用Websocket

我們正面臨着一個問題,即所有從瀏覽器到後端的websocket連接請求都會失敗,出現HTTP 400 Expected UpgradeToWebsocket header錯誤。

經過進一步調查,我們發現客戶端能夠直接連接到負載均衡器,但通過cloudfront的任何連接請求都會失敗。最終,我在AWS Cloudfront文檔中發現了this page,其中說,cloudfront刪除了任何「升級」標頭,這可能是客戶端無法連接的原因。

要解決此問題,我啓用了所有「標題轉發」選項(禁用緩存),但仍然無法使用。此外,我無法找到任何選項來選擇性地禁用雲端緩存或繞過某些URL的雲端服務。

我該如何解決此問題並確保websockets能夠通過cloudfront工作?或者這只是不被支持?

回答

0

CloudFront目前不支持Web套接字。

即使您嘗試配置CloudFront以轉發它們,某些標頭也會從請求中除去。這些在page you mentioned的表格中由表示,「CloudFront刪除標題」Caching Based on Header Values Is Supported = 「否」

從AWS論壇:

放心,正確的人都知道這個功能要求。

—理查德@ AWS(2015年6月6日)

https://forums.aws.amazon.com/thread.jspa?messageID=723375

3

CloudFront的不是網絡套接字正確的解決方案,因爲它是針對靜態網頁緩存進行了優化,而網絡套接字大都是動態的另一方面,ELB確實支持HTTP Web套接字(ws://)和安全web套接字(wss://),並且可以將其配置爲處理所有SSL握手。但是,您需要使用TCP設置對其進行配置,以便在服務器正在傳輸時保持HTTP/HTTPS連接處於打開狀態。下面是它是如何做:

  1. 單擊EC2負載均衡器選項卡
  2. 選擇「經典負載平衡器」,「創建負載平衡器」。你需要的是,爲了做一個簡單的TCP
  3. 定義源和目的地協議(TCP選擇對於普通的網絡套接字):

enter image description here 4.如果你正在做着做着就需要安全的網絡套接字選擇一個證書,如下所示:

enter image description here 5.配置運行狀況檢查,添加實例並按「創建」。定義CNAME並完成設置。

請注意,如果您選擇「HTTP」或「HTTPS」作爲源協議,則負載平衡器將在某個時間點拋出408錯誤代碼(超時),因爲它不是用來保持連接打開時間過長。這就是我們選擇TCP的原因。