2

在AWS上託管的Laravel/Vue.JS應用程序位於經典負載平衡器(Elastic Beanstalk)後面,並通過Nginx內部代理到socket.io服務器。 SSL在Nginx上終止。AWS EB:在WebSocket握手期間發生錯誤:意外的響應代碼:400

這是nginx的配置:

location /socket.io { 
    proxy_pass   http://127.0.0.1:6001; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade   $http_upgrade; 
    proxy_set_header Connection  "upgrade"; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP   $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
} 

眼下長輪詢模式工作正常,但它未能啓動升級:

WebSocket連接到「WSS://例子?的.com/socket.io/EIO = 3 &運輸= WebSocket的& SID = HmDFtq-aj1WgfGUyAAAJ」失敗:錯誤的WebSocket握手期間:意外的響應代碼:400

P.S Chrome的Frames標籤我只能看到這個奇怪的消息:(Opcode -1)

已順利拿到socket.io上的AWS彈性魔豆的環境中工作人?我只是浪費了兩週的時間來處理這個問題,非常感謝任何建議或想法。謝謝!

更新。我打開一個詳細的日誌記錄,這裏是Nginx的內部變量:

$host example.com 
$proxy_add_x_forwarded_for 134.xxx.xxx.xxx 
$http_upgrade - 
$remote_addr 172.31.10.208 
$remote_user - 
$server_name _ 
$upstream_addr 127.0.0.1:6001 
$request GET /socket.io/?EIO=3&transport=polling&t=Lw26sYn&sid=6L5iHma-GJOeE3JQAAAX HTTP/1.1 
$upstream_response_time 24.658 msec 
$request_time 24.658 

也許會有人發現一些值不正確,所以我將不勝感激任何意見的。

+0

刪除'proxy_set_header Host $ host;'並測試 –

+0

@TarunLalwani不幸的是它不起作用。 –

+0

你在'6001'套接字服務器日誌上看到了什麼? –

回答

4

您的ELB使用HTTP/HTTP偵聽器還是TCP/SSL偵聽器? Websockets只適用於後者的協議類型。將偵聽器更改爲TCP,它將工作。另外,如果您使用CLI或API構建環境,則還可以使用應用程序負載平衡器(ALB)而不是經典負載平衡器(ELB)重建您的ElasticBeanstalk應用程序,因爲ALB也支持websockets。該選項不可通過Web控制檯使用。

+0

謝謝,我會盡力並儘快回覆。我想我以前試過,但我會再試一次。 –

+0

酷,它似乎工作,但仍然,我有一個實例(我有兩個)400錯誤。您的方法是否適用於多個實例? –

+0

是的,但在ELB上,您需要「啓用粘滯會話」或「禁用跨區域負載均衡」。目的是確保HTTP和websocket請求都轉到同一個實例。我沒有一個測試用例設置來證明它可行,但是讓我知道它是否可行,我會更新答案。 –

相關問題