亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 AWS 應用程序負載均衡器上使用 Go 時,WebSocket 連接失敗并顯示 301

在 AWS 應用程序負載均衡器上使用 Go 時,WebSocket 連接失敗并顯示 301

Go
拉莫斯之舞 2023-07-26 13:13:38
我嘗試在 AWS Application Load Balancer 上運行帶有 WebSocket 的 Go 服務器,但收到&ldquo;WebSocket 握手期間錯誤:意外的響應代碼:301&rdquo;。AWS 表示應用程序負載均衡器通過ws://協議支持 WebSocket,但除了以下內容之外,我找不到任何其他文檔:這是aws 負載均衡器鏈接Application Load Balancer 支持兩種附加協議:WebSocket 和 HTTP/2。WebSocket 允許您在客戶端和服務器之間建立長期的 TCP 連接。這是一種比老式方法更有效的替代方法,老式方法涉及通過&ldquo;心跳&rdquo;長時間保持打開狀態的 HTTP 連接。WebSocket 非常適合移動設備,可用于提供股票報價、體育比分和其他動態數據,同時最大限度地降低功耗。ALB 通過 ws:// 和 wss:// 協議提供對 WebSocket 的本機支持。我可以讓 JavaScript 在本地通過 WebSockets 連接到我的 Go 服務器,但是當我部署 AWS 時它不起作用。這是 JavaScript 顯示 301 錯誤的時候。應用程序負載均衡器正在偵聽HTTP: 80,并且該流量被定向到HTTPS: 443。所有安全組的設置都非常相似,以允許流量通過。如果我在部署在 AWS 上時執行正常的 GET 調用以從服務器檢索數據,那么它工作得很好。用于連接到本地主機的本地調用<script>? ? let socket = new WebSocket("ws://localhost:8080/websocket")? ? console.log("Attempting Websocket Connection")? ? socket.onopen = () => {? ? ? ? console.log("Successfully Connected");? ? ? ? socket.send("Hi From the Client!")? ? }? ? socket.onclose = (event) => {? ? ? ? console.log("Socket Closed Connection: ", event)? ? }? ? socket.onmessage = (msg) => {? ? ? ? console.log(msg);? ? }? ? socket.onerror = (error) => {? ? ? ? console.log("Socket Error: ", error)? ? }</script>連接到不工作的遠程服務器。<script>? ? let socket = new WebSocket("ws://myexamplesite.com/websocket")? ? console.log("Attempting Websocket Connection")? ? socket.onopen = () => {? ? ? ? console.log("Successfully Connected");? ? ? ? socket.send("Hi From the Client!")? ? }? ? socket.onclose = (event) => {? ? ? ? console.log("Socket Closed Connection: ", event)? ? }? ? socket.onmessage = (msg) => {? ? ? ? console.log(msg);? ? }? ? socket.onerror = (error) => {? ? ? ? console.log("Socket Error: ", error)? ? }</script>nginx.confevents {? ? worker_connections 1024;}http {? server_tokens off;? server {? ? listen 80;? ? location / {? ? ? proxy_set_header X-Forwarded-For $remote_addr;? ? ? proxy_set_header Host? ? ? ? ? ? $http_host;? ? ? proxy_pass http://web:8080/;? ? }? }}我希望能夠建立 WebSocket 連接,但 JavaScript 文件返回以下錯誤:與&ldquo;ws://myexamplesite.com/websocket&rdquo;的 WebSocket 連接失?。篧ebSocket 握手期間出錯:意外的響應代碼:301
查看完整描述

2 回答

?
嚕嚕噠

TA貢獻1784條經驗 獲得超7個贊

我能夠通過結合這兩個答案來使其發揮作用。


nginx.conf 現在看起來像


http {

  server_tokens off;

  server {

    listen 80;


    location / {

      proxy_set_header X-Forwarded-For $remote_addr;

      proxy_set_header Host            $http_host;

      proxy_pass http://web:8080/;

    }


    location /websocket {

           proxy_http_version 1.1;

           proxy_set_header Upgrade $http_upgrade;

           proxy_set_header Connection "upgrade";

           proxy_pass http://web:8080/websocket;

    }

  }

}

然后將 JavaScript 文件ws://更改為wss://


<script>

    let socket = new WebSocket("wss://myexamplesite.com/websocket")


    console.log("Attempting Websocket Connection")


    socket.onopen = () => {

        console.log("Successfully Connected");

        socket.send("Hi From the Client!")

    }


    socket.onclose = (event) => {

        console.log("Socket Closed Connection: ", event)

    }


    socket.onmessage = (msg) => {

        console.log(msg);

    }


    socket.onerror = (error) => {

        console.log("Socket Error: ", error)

    }

</script>



查看完整回答
反對 回復 2023-07-26
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

首先檢查 AWS ALB 配置方面的所有內容是否正確,并且請求是否已到達 Nginx 服務器,您可以在日志中檢查該服務器。還可以嘗試通過 Nginx 訪問您的 websocket URL。您需要在 Nginx 中進行額外的配置來支持您所在位置下的 websockets,如下所述:

proxy_set_header?Upgrade?$http_upgrade;
proxy_set_header?Connection?"Upgrade";

我也遇到過同樣的問題,并且使用這個配置開始變得輕而易舉。

注意:Websockets 肯定可以與 AWS ALB 配合使用,所以不要懷疑這一部分。


查看完整回答
反對 回復 2023-07-26
  • 2 回答
  • 0 關注
  • 416 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號