问题
我正在使用haproxy来平衡Web服务器的负载。我将会话持久性与其他cookie一起使用,因为某些应用程序使用会话文件,并且这些文件在服务器之间不同步。
我想禁用服务器进行维护,但不要中断会话。因此,我想允许现有客户端继续其应用程序会话,但不接受新客户端。
代理行为
- 我将服务器设置为“要维护”
- 如果客户端设置了cookie,则即使标记为“进入维护”也要使用服务器
- 如果有新客户端(没有cookie),则将其定向到另一台服务器
- 在所有客户端结束他们的应用程序会话后,不再有客户端将cookie设置到该特定服务器上了,我最好在不中断用户的情况下将其关闭。
您是否认为通过某些haproxy配置可以实现?还是有一个聪明的方法吗?
其他方法
实现此需求的其他方法的非详尽清单:
- 在服务器之间同步会话文件(需要一种在多个服务器之间或公共的单个安装点之间同步文件的方法)
- 使用数据库存储会话信息(需要更改应用程序行为)
更多细节
我使用这种配置:
frontend https-in
bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
reqadd X-Forwarded-Proto:\ https
acl APP1 hdr(host) -i APP1.atac.local
use_backend APP1 if APP1
default_backend _default
backend APP1
redirect scheme https if !{ ssl_fc }
mode http
balance roundrobin
cookie HAPROXY_SESSION insert indirect
option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
server SRV1 SRV1_IP:PORT cookie SRV1 check
server SRV2 SRV2_IP:PORT cookie SRV2 check
如果我只是禁用SRV1(使用haproxy cli命令),则我认为在当前HTTP“会话”结束后,在SRV1上打开的所有应用程序会话都会中断。那正确吗?
您的服务器运行在HTTP模式还是TCP模式?
—
奥斯丁2015年
@奥斯汀; 可能是http模式,就像他在谈论基于cookie的平衡和持久性一样(TCP模式不提供此类功能)。
—
GregL
@Christophe,您是否实际尝试过“异常行为”部分中描述的配置,因为它可以工作。
—
GregL
@GregL,对,那也是我的想法。如果他使用的是HTTP模式,并且只是将服务器设置为维护模式,则它将停止接受新会话,但将有效会话保持活动状态,直到它们到期为止。您仍然可以在TCP模式下使用cookie等,但这对HAProxy毫无意义。
—
奥斯丁2015年
@Christophe,您是要使用“更聪明的方法”来缩短维护时间,还是只是在等待维护时寻找一种使会话正常结束的方法?
—
奥斯丁2015年