2011-11-16 25 views
5

HAProxy altında kimlik doğrulamasıyla çalışan birçok socket.io örneğim var ve kimlik doğrulama isteğinin ve soket bağlantısının aynı örnekte gitmesini zorlamalıyım. Ben böylece bazı değişikliklerle this answer to a SO question dayalı HAProxy kurdum: Ben url_param denedimKimlik doğrulama ile HAProxy ve socket.io ile yapışkan oturumları yapabilir miyim?

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 

bakiye olarak ve kaynak (sessionId bir sorgu dizesi kimlik doğrulama çağrı ve WebSocket bağlantısı hem geçirilen parametre olduğu) seçenekler, ancak HAProxy sadece HTTP bağlantıları için bu seçeneklere izin veriyor ve gerçek websocket bağlantısı için onları yok sayar gibi görünüyor. Sonuç olarak, bazen doğrulama isteği ve soket bağlantısı, farklı sunucularda sonuçlanır ve bu da bizim başvurumuz için kabul edilemez.

İstenilen davranışa sahip olmanın bir yolu var mı?

+0

Hiç Bunu yapmanın en iyi yolu anlamaya mı ise onu yeniden gönderdiğinizde gerekip gerekmediğini yapılandırabilirsiniz? Ben de aynı şeyi yapmak istiyordum. Teşekkürler. –

+0

IP-hash dengelemeyi kullanarak sona erdim. Aynı IP'den gelen tüm istekler aynı sunucuya gider – Diego

+0

Tamam, ama bu A sunucusundaki bir kullanıcı tarafından yayınlanan bir web bağlantısının, sunucu B'deki herhangi bir kullanıcıya ulaşmadığı anlamına mı geliyor? –

cevap

0

Websocket bağlantıları için roundrobin. Bir Çift Yönlü soket (TCP üzerinden) yapışkanlık varsayılan olarak korunur. source dengeleme algoritması kullanılarak diğer taşımacılık için en iyi seçimdir. (Sen çerez tabanlı kalıcılığını kullanabilirsiniz ama bir jsessionid veya geri proxy sunucusuna gibi socket.io göndermez çerez tabanlı kalıcılığı istiyorsanız sockjs deneyebilirsiniz..)

Örnek:

#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

Sorun, kimlik doğrulama isteğinin ve websocket bağlantısının farklı sunucularda ortaya çıkabilmesidir. Onları her zaman aynı sunucuya gitmenin bir yolu var mı? Başka yük dengeleyicisinin bunu sağlayıp sağlamadığını biliyor musunuz? – Diego

+0

Auth mağazanızın uygulamadan ayrılması koşuluyla hangi sunucunun vurulduğu fark etmez. Umarım hafızayı yetkisiz oturumlar için mağazanız olarak kullanmazsınız. Kimlik anahtarını saklamak için Redis gibi bir şey kullanın. Http://stackoverflow.com/questions/4753957/socket-io-authentication/4754806#4754806 –

2

TCP bağlantısını dengelemek için, stick_match veya stick on komutlarını kullanarak ve tcp modunu açık bir şekilde ayarlayarak bir yapışkanlık tablosuyla biraz başarılı olabilirsiniz. here mevcut

# 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 

Tüm belgeler: Burada

bir örnektir.

9

ben bu şekilde çerez tabanlı dengeleme kullanın: HTTP kullanarak konum

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

Çerez yöntemi için, çerez zaman aşımı süresini belirlemenin bir yolu var mı? – Alessandro

0

böylece kalıcılığı için bir çerez eklemek - bu kesinlikle iyi yolu. Bu, aşağı olmadıkça gittikleri ilk sunucuya yapışır.

Ayrıca aşağı vb

İlgili konular