2011-11-16 127 views
5

我有幾個socket.io實例在HAProxy下運行身份驗證,我需要強制認證請求和套接字連接去同一個實例。我已經設置了HAProxy的基礎上this answer to a SO question有一些修改爲這樣:我可以通過身份驗證與HAProxy和socket.io進行粘性會話嗎?

global 
    maxconn  4096 # Total Max Connections. This is dependent on ulimit 
    nbproc  2 

defaults 
    mode  http 

frontend all 0.0.0.0:80 
    timeout client 86400000 
    default_backend www_backend 
    acl is_websocket hdr(Upgrade) -i WebSocket 
    acl is_websocket hdr_beg(Host) -i ws 

    use_backend socket_backend if is_websocket 

backend www_backend 
    balance url_param sessionId 
    option forwardfor # This sets X-Forwarded-For 
    timeout server 30000 
    timeout connect 4000 
    server server1 localhost:8081 weight 1 maxconn 1024 check 
    server server2 localhost:8082 weight 1 maxconn 1024 check 
    server server3 localhost:8083 weight 1 maxconn 1024 check 

backend socket_backend 
    balance url_param sessionId 
    option forwardfor # This sets X-Forwarded-For 
    timeout queue 5000 
    timeout server 86400000 
    timeout connect 86400000 
    server server1 localhost:8081 weight 1 maxconn 1024 check 
    server server2 localhost:8082 weight 1 maxconn 1024 check 
    server server3 localhost:8083 weight 1 maxconn 1024 check 

我試過url_param(其中的sessionId是在這兩個認證的呼叫和WebSocket連接傳遞一個查詢字符串參數)和源作爲平衡選項,但似乎HAProxy只允許HTTP連接的這些選項,因此忽略它們以用於實際的websocket連接。其結果是,有時認證請求和套接字連接最終會在不同的服務器中出現,這對我們的應用程序來說是不可接受的。

有沒有某種方法來獲得這種理想的行爲?

+0

你有沒有想過最好的方法來做到這一點?我期待着做同樣的事情。謝謝。 –

+0

我結束了使用IP哈希平衡。所有來自同一個IP的請求都會轉到同一臺服務器 – Diego

+0

O ok,但這是否意味着從服務器A上的用戶廣播的websocket不會到達服務器B上的任何用戶? –

回答

0

對於使用roundrobin的websocket連接餘額。由於它的雙向套接字(通過TCP)粘性保持默認。對於使用source平衡算法的其他傳輸是最好的選擇。 (您可以使用基於Cookie的持久性,但socket.io不發送JSESSIONID或類似回代理服務器可以嘗試sockjs如果你想基於Cookie的持久性。)

例子:

#do the same for other transports. [Note in 0.6.x resource was mounted at path: /socket.io/[transport] 
acl is_JSONPolling path_beg /socket.io/1/jsonp-polling 
use_backend non_websocket if is_JSONPolling 


backend non_websocket 
    balance source 
    #rest same as the one for websocket backend 
+0

問題是身份驗證請求和websocket連接可能以不同的服務器結束。有沒有辦法讓他們總是去同一臺服務器?你知道是否有其他負載平衡器提供這個? – Diego

+0

只要您的授權存儲與應用程序分開,無論哪臺服務器都受到影響。希望你沒有使用內存作爲你的auth會話存儲。使用類似Redis的內容來存儲授權密鑰。看看我的答案在這裏處理auth:http://stackoverflow.com/questions/4753957/socket-io-authentication/4754806#4754806 –

2

要平衡TCP連接,使用stick_matchstick on命令並明確設置tcp模式,可能會在粘性表中取得一些成效。

下面是一個例子:

# forward SMTP users to the same server they just used for POP in the 
# last 30 minutes 
backend pop 
    mode tcp 
    balance roundrobin 
    stick store-request src 
    stick-table type ip size 200k expire 30m 
    server s1 192.168.1.1:110 
    server s2 192.168.1.1:110 

backend smtp 
    mode tcp 
    balance roundrobin 
    stick match src table pop 
    server s1 192.168.1.1:25 
    server s2 192.168.1.1:25 

可用here完整文檔。

9

我使用基於cookie的平衡以這樣的方式

backend socketio 
    mode http 
    cookie SIO insert 
    server sock1 127.0.0.1:8001 cookie 001 
    server sock2 127.0.0.1:8002 cookie 002 
+0

對於cookie方法,有沒有辦法設置cookie超時期限? – Alessandro

0

您使用HTTP所以插入一個cookie的持久性 - 這是絕對的最佳途徑。這將堅持到他們去的第一臺服務器,除非它停機。

您還可以配置它是否應該重新發送它,如果它是關閉等

相關問題