我使用 HAproxy 在多个 Web 服务器之间进行负载平衡。这些 Web 服务器使用 PHP 和会话来保持会话打开。
现在我思考当用户刷新页面时,它会被发送到其中一个服务器,但是,如果他被发送到不同的服务器,他当然会丢失他的会话,不是吗?
问题主要是:如何让客户端连接到同一个服务器?
这是我的后端配置。
backend social_backend
mode http
option httplog
option http-server-close
option forceclose
no option httpclose
balance roundrobin
option forwardfor
timeout queue 5000
timeout server 86400000
timeout connect 86400000
timeout check 1s
server socket1 10.10.10.1:81 weight 1 maxconn 1024 check
server socket2 10.10.10.2:81 weight 1 maxconn 1024 check
server socket3 10.10.10.3:81 weight 1 maxconn 1024 check
答案1
您正在寻找的是“粘性会话”,您可以使用appsession
HAProxy 中的参数来启用它:
appsession <cookie> len <length> timeout <holdtime>
[request-learn] [prefix] [mode <path-parameters|query-string>]
当在后端中定义应用程序 cookie 时,HAProxy 将检查服务器何时设置此类 cookie,并将其值存储在表中,并将其与服务器的标识符相关联。将保留来自值的最多 字符。在每个连接上,haproxy 将在“Cookie:”标头和 URL 参数中查找此 cookie(取决于使用的模式)。如果找到已知值,客户端将被定向到与此值关联的服务器。否则,将应用负载平衡算法。当 Cookie 未使用的时间超过 时,它们会自动从内存中删除。
每个后端的应用程序 cookie 定义仅限于一个。
例如:appsession JSESSIONID len 52 超时 3h
参考 HAProxy文档更多细节。