Haproxy

socket.io 會話以 HAproxy 結束

  • August 23, 2021

我一直在處理 HAproxy 的配置以使其與 socket.io 一起工作。

我的最後一個問題是:HAProxy 正在記憶體轉發?我讓它工作了,但是由於某種原因,在進行身份驗證並發送了一些命令之後,連接被斷開並建立了一個新連接,如您在此處看到的:

 info  - handshake authorized 2ZqGgU2L5RNksXQRWuhi
 debug - setting request GET /socket.io/1/websocket/2ZqGgU2L5RNksXQRWuhi
 debug - set heartbeat interval for client 2ZqGgU2L5RNksXQRWuhi
 debug - client authorized for 
 debug - websocket writing 1::
 debug - websocket received data packet 5:3+::{"name":"ferret","args":["tobi"]}
 debug - sending data ack packet
 debug - websocket writing 6:::3+["woot"]
 info  - transport end (socket end)
 debug - set close timeout for client 2ZqGgU2L5RNksXQRWuhi
 debug - cleared close timeout for client 2ZqGgU2L5RNksXQRWuhi
 debug - cleared heartbeat interval for client 2ZqGgU2L5RNksXQRWuhi
 debug - discarding transport
 debug - client authorized
 info  - handshake authorized WkHV-B80ejP6MHQTWuhj
 debug - setting request GET /socket.io/1/websocket/WkHV-B80ejP6MHQTWuhj
 debug - set heartbeat interval for client WkHV-B80ejP6MHQTWuhj
 debug - client authorized for 
 debug - websocket writing 1::
 debug - websocket received data packet 5:4+::{"name":"ferret","args":["tobi"]}
 debug - sending data ack packet
 debug - websocket writing 6:::4+["woot"]
 info  - transport end (socket end)

我嘗試了幾種配置,如下所示:https ://stackoverflow.com/questions/4360221/haproxy-websocket-disconnection/

並且還聲明 2 個後端,並使用 ACL 在請求是 websocket 請求時轉發到具有選項 http-pretend-keepalive 的後端,並在請求僅針對 socket.io 時轉發到具有 http-server-close 的後端靜態文件或任何其他類型的不是 websocket 的請求。

我要澄清的是,http-server-close 僅在 nginx 後端和靜態文件後端,http-pretend-keepalive 在前端和 websocket 後端。

誰能指出我正確的方向?我嘗試了幾種組合,但到目前為止都沒有奏效。

從 HAproxy 郵件列表中得到了答案,其中一個名為“Baptiste”的使用者給了我這個連結:

http://blog.exceliance.fr/2012/11/07/websockets-load-balancing-with-haproxy/

該配置與 socket.io 完美配合(使用除 flashsockets 之外的所有協議進行了測試)。使它起作用的是預設指令中的一組選項,實際上不需要檢查後端中的 websockets 和標頭檢查,您可以將自己的 ACL 設置為您需要決定是否使用正在執行的後端的任何內容socket.io 應用程序與否。

HAproxy 的穩定版本不適用於此配置,您需要 1.5-devel10 或更高版本才能使其正常工作(我使用的是 1.5-devel14 版本)。

引用自:https://serverfault.com/questions/453116