我有一个 Nginx 实例,它为从 haproxy 代理到它的请求提供服务。此实例应在多个 websocket 服务器之间平衡负载。为了获得更好的性能,负载平衡应该是固定的,因此我使用 ip_hash 作为负载平衡方法,但由于所有请求都来自 haproxy,因此该方法不起作用。因此我尝试基于 x-forwarded-for 标头进行负载平衡,如下所示:
upstream orderbook {
hash $http_x_forwarded_for consistent;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
使用此方法可以在后端之间分配负载,但会破坏会话持久性(我猜是因为大多数客户端都从 websockets 切换到了 longpolling)!我该怎么做才能基于真实客户端 ip 实现 LB?
编辑:尝试了所有方法后,大多数客户端通过更改客户端连接配置并添加以下内容再次切换为使用 websocket:
transports: ['websocket','polling'],
似乎在默认配置中,socket.io 首先尝试建立长轮询连接。但我想知道使用 nginx 负载平衡和客户端选择的传输方式变化之间有什么联系。
答案1
为了确保 WebSocket 连接保持粘性并始终路由到同一后端节点,可以使用 Nginx 中的 ip_hash 指令。此指令根据客户端的 IP 地址启用会话持久性。
下面是一个示例配置,演示如何使用 ip_hash 进行 WebSocket 负载平衡:
http {
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
# Add more backend servers here if needed
}
server {
listen 80;
location /socket.io {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}