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ı?
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. –
IP-hash dengelemeyi kullanarak sona erdim. Aynı IP'den gelen tüm istekler aynı sunucuya gider – Diego
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? –