![使用 HAProxy 使客户端在没有初始会话标识符的情况下保持粘性](https://linux22.com/image/606866/%E4%BD%BF%E7%94%A8%20HAProxy%20%E4%BD%BF%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%A8%E6%B2%A1%E6%9C%89%E5%88%9D%E5%A7%8B%E4%BC%9A%E8%AF%9D%E6%A0%87%E8%AF%86%E7%AC%A6%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BF%9D%E6%8C%81%E7%B2%98%E6%80%A7.png)
我们在两个 API 服务器前面安装了 HAProxy。目前使用的appsession
原因在于许多 API 客户端不会维护 cookie - 这是一个我们不想传递给用户的负担。
我们面临的问题是,一旦客户端登录,他们就必须停留在该特定 API 服务器上,因为 API 服务器会代表客户端与其他服务建立连接。不幸的是,在发出第一个登录请求之前没有会话标识符,因此下一个使用会话标识符发出的请求通常会循环发送到对面的服务器并粘在那里。
这是我们的后端配置:
backend api
mode http
option httplog
option httpclose
option httpchk HEAD /index.html
cookie apibalance insert indirect nocache
appsession sessionId len 36 timeout 360s request-learn mode query-string
server api01 api01.hostname:8080 cookie api1 check weight 30 inter 10000 downinter 20000
server api02 api01.hostname:8080 cookie api2 check weight 30 inter 10000 downinter 20000
这cookie apibalance
是我们做事时遗留下来的,但我想我们现在可以将其去除。
有没有办法告诉 HAProxy(可能通过响应),sessionId
查询字符串中的未来请求应该坚持使用当前服务器?会话 ID 在服务器端(API 服务器)生成,并在 JSON 响应中返回。后续请求将使用查询字符串中的会话 ID 发送。
答案1
至少对我来说,答案是实现基于 IP 的粘性。
balance source
并删除基于cookie和appsession的配置。