簡體   English   中英

如何在AWS Cloudfront上啟用websockets

[英]How to enable websockets on AWS Cloudfront

我有一個在AWS EC2 Autoscale集群上運行的Akka HTTP服務器。 此EC2自動擴展群集前面有一個ELB應用程序負載平衡器。 除了ELB之外,我們還有一個雲端分布,設置為提供靜態文件。

我們面臨的問題是,從瀏覽器到后端的所有websocket連接請求都因HTTP 400 Expected UpgradeToWebsocket header錯誤而失敗。

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

若要解決此問題,我啟用了所有“標頭轉發”選項(禁用緩存),但它仍然無法正常工作。 此外,我找不到任何選擇性禁用雲端緩存或完全繞過某些URL的雲端的選項。

如何解決此問題並確保websockets通過雲端工作? 或者這只是不支持?

更新

CloudFront宣布在2018-11-20 支持Websockets

CloudFront全局支持WebSocket連接,無需任何其他配置。 只要客戶端和服務器都支持該協議,所有CloudFront發行版都具有內置的WebSocket協議支持。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-working-with.websockets.html

客戶端負責重新建立丟失的任何websocket連接。

CloudFront目前不支持Web套接字。

即使您嘗試將CloudFront配置為轉發它們,某些標頭也會從請求中刪除。 這些在 “CloudFront刪除標題”所 提到頁面上的表格中顯示,並且 Caching Based on Header Values Is Supported = “否”

來自AWS論壇:

請放心,合適的人知道此功能請求。

- Richard @ AWS(2015-06-06)

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

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

  1. 單擊EC2負載平衡器選項卡中的“創建負載平衡器”
  2. 選擇“Classic Load Balancer”。 你需要它來做一個簡單的TCP
  3. 定義源和目標協議(為純Web套接字選擇TCP):

在此輸入圖像描述 4.如果您正在進行安全的Web套接字,則需要選擇一個證書,如下所示:

在此輸入圖像描述 5.配置運行狀況檢查,添加實例並按“創建”。 定義CNAME,你就完全了。

請注意,如果選擇“HTTP”或“HTTPS”作為源協議,負載均衡器將在某個時刻拋出408錯誤代碼(超時),因為它不是為了保持連接打開時間太長而設計的。 這就是我們選擇TCP的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM