[英]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協議支持。
客戶端負責重新建立丟失的任何websocket連接。
CloudFront目前不支持Web套接字。
即使您嘗試將CloudFront配置為轉發它們,某些標頭也會從請求中刪除。
這些在
“CloudFront刪除標題”所
提到的
頁面上的表格中顯示,並且
Caching Based on Header Values Is Supported
=
“否” 。
來自AWS論壇:
請放心,合適的人知道此功能請求。
- Richard @ AWS(2015-06-06)
CloudFront不是Web套接字的正確解決方案,因為它針對靜態網頁的緩存進行了優化,而Web套接字大多是動態的。 另一方面,ELB支持HTTP Web套接字(ws://)和Secure Web套接字(wss://),並且可以將其配置為處理所有SSL握手。 但是,您需要使用TCP設置對其進行配置,以便在服務器傳輸時保持HTTP / HTTPS連接處於打開狀態。 以下是它的完成方式:
4.如果您正在進行安全的Web套接字,則需要選擇一個證書,如下所示:
5.配置運行狀況檢查,添加實例並按“創建”。 定義CNAME,你就完全了。
請注意,如果選擇“HTTP”或“HTTPS”作為源協議,負載均衡器將在某個時刻拋出408錯誤代碼(超時),因為它不是為了保持連接打開時間太長而設計的。 這就是我們選擇TCP的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.