设想
我有一个由 3 个(apache)网络服务器组成的 haproxy 场。其中 2 个处于主动平衡状态,第三个通常是备份。
时不时地,我想将第三台服务器从备份角色中移除,并将其设为“补丁”服务器。但我想在不更改 URL 的情况下执行此操作(例如,我不想使用 patch.mysite.com)
我想要发生的事情是,我访问http://mysite.com/patch
并让 haproxy 为服务器提供一个 cookie 以供稍后在 ACL 中使用,但删除/patch
并将发送GET /
到后端服务器。
我现在的情况是 ACL 工作正常,但是 reqrep 在将 /patch 请求发送到后端之前不会删除它。
配置:
global
log 127.0.0.1 local0 info
maxconn 25000
daemon
spread-checks 2
defaults
log global
mode http
balance roundrobin
option httplog
option redispatch
option abortonclose
option forwardfor
option http-server-close
frontend webfarm :80
# FILTERING
acl acl_patch path_end /patches
use_backend patch if acl_patch
default_backend default_farm
backend default_farm
cookie SERVERID insert indirect
server prod1 192.168.100.18:80 cookie live01 check
server prod2 192.168.100.22:80 cookie live02 check weight 2
server prod3 192.168.100.20:80 cookie live03 check backup
# do not let this cookie tell our internal IP address
rspidel ^Set-cookie:\ IP=
backend patch
cookie SERVERID insert indirect
server prod3 192.168.100.20:80 cookie live03
reqrep ^([^\ ]*)\ /patch \1\ /
# do not let this cookie tell our internal IP address
rspidel ^Set-cookie:\ IP=
haproxy 日志仍然指定GET /patch
正在发送到后端。我遗漏了关于 reqrep 的什么信息(我不关心 /patch 目录之后的任何内容)?
答案1
首先,您的规则还应该保留 HTTP 版本部分。
其次,为什么不使用“force-persist”语句呢?它就是为这个角色而设计的。只需在您的请求中找到一些与访问者请求不同的内容,设置一个 cookie 来访问它,然后您就可以使用此服务器了。这种机制正是为维护操作而设计的,而不必让服务器对其他用户显示为正常运行。
或者,在您的情况下,您也可以使用“重定向”方法,因为它支持“set-cookie”选项;然后在您的前端,您将用如下内容替换 use_backend 规则:
redirect location / code 302 set-cookie SERVERID=live03 if acl_patch
然后,您的浏览器将学习此 cookie 并重定向到 /,服务器 3 将在此处理请求。如果您愿意,甚至可以使用 clear-cookie 选项来消除粘性。