Tôi có một số trường hợp socket.io với xác thực đang chạy dưới HAProxy và tôi cần phải buộc rằng yêu cầu xác thực và kết nối ổ cắm đi đến cùng một cá thể. Tôi đã thiết lập HAProxy dựa trên this answer to a SO question với một số sửa đổi như vậy:Tôi có thể có phiên cố định với HAProxy và socket.io có xác thực không?
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
Tôi đã thử url_param (nơi sessionId là một tham số chuỗi truy vấn thông qua trong cả hai cuộc gọi xác thực và kết nối WebSocket) và nguồn như sự cân bằng tùy chọn nhưng có vẻ như HAProxy chỉ cho phép các tùy chọn này cho các kết nối HTTP và do đó bỏ qua chúng cho kết nối websocket thực tế. Kết quả là đôi khi yêu cầu xác thực và kết nối socket kết thúc trong các máy chủ khác nhau, điều này không thể chấp nhận được đối với ứng dụng của chúng tôi.
Có cách nào để có hành vi mong muốn này không?
Bạn đã bao giờ tìm ra cách tốt nhất để làm điều này? Tôi đang tìm cách làm điều tương tự. Cảm ơn. –
Tôi đã kết thúc bằng cách sử dụng cân bằng băm IP. Tất cả các yêu cầu từ cùng một IP đi đến cùng một máy chủ – Diego
O ok, nhưng điều đó có nghĩa là một websocket đang được phát sóng từ một người dùng trên máy chủ A không đạt được bất kỳ người dùng nào trên máy chủ B? –