haproxy reqrep 的问题

haproxy reqrep 的问题

设想

我有一个由 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 选项来消除粘性。

相关内容