Jim*_*Jim 30 rewrite load-balancing haproxy uri
关于 HAProxy reqrep 的真正快速问题。我正在尝试重写/替换发送到后端的请求。
我有以下示例域和 URI,它们共享相同的域名,但后端 Web 服务器池不同。
http://domain/web1
http://domain/web2
Run Code Online (Sandbox Code Playgroud)
我希望 web1 转到后端 webfarm1,而 web2 转到 webfarm2。目前这确实发生了。但是,当请求发送到后端时,我想去掉 web1 或 web2 URI。
这是我的 haproxy.cfg
frontend webVIP_80
mode http
bind :80
#acl routing to backend
acl web1_path path_beg /web1
acl web2_path path_beg /web2
#which backend
use_backend webfarm1 if web1_path
use_backend webfarm2 if web2_path
default_backend webfarm1
backend webfarm1
mode http
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
balance roundrobin
option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
server webtest1 10.0.0.10:80 weight 5 check slowstart 5000ms
server webtest2 10.0.0.20:80 weight 5 check slowstart 5000ms
backend webfarm2
mode http
reqrep ^([^\ ]*)\ /web2/(.*) \1\ /\2
balance roundrobin
option httpchk HEAD /index HTTP/1.1\r\nHost:\ example.com
server webtest1-farm2 10.0.0.110:80 weight 5 check slowstart 5000ms
server webtest2-farm2 10.0.0.120:80 weight 5 check slowstart 5000ms
Run Code Online (Sandbox Code Playgroud)
如果我去http://domain/web1或http://domain/web2在错误日志中看到每个后端服务器上的请求分别是针对资源 /web1 或 /web2 的请求。因此,我认为我的正则表达式有问题,即使我从文档中复制并粘贴了它。http://code.google.com/p/haproxy-docs/wiki/reqrep
摘要:我正在尝试根据 URI 路由流量,但是我希望 HAProxy 在将请求发送到后端池时剥离 URI。
谢谢!
-吉姆
lon*_*eck 30
你有这个:
reqrep ^([^\ ]*)\ /web1/(.*) \1\ /\2
Run Code Online (Sandbox Code Playgroud)
我想你想要这个:
reqrep ^([^\ ]*\ /)web1[/]?(.*) \1\2
Run Code Online (Sandbox Code Playgroud)
不同之处在于,如果省略 webN 之后的 / ,则第二个将起作用。
为了回答您在下面的评论,详细了解上述表达式的工作方式比我所能付出的更多。但是,也许这会有所帮助。
/web1 之前的所有内容都在“捕获”请求字符串中 web1 之前的所有内容。所以通常这将是 GET 或 POST。(.*) “捕获” web1 之后的所有内容,如果什么都没有,则不包括任何内容。
下一部分 ( \1\2) 说明如何处理这些捕获的部分。它说形成一个由\1(第一个捕获的部分)和\2(后面是第二个捕获的部分)组成的字符串。由于从未捕获 web1,因此不会将其组装到最终输出中。
从 HAProxy 2.1 版开始,就没有 reqrep 指令。所以你可以使用以下内容:
http-request replace-path /web1(.*) \1
Run Code Online (Sandbox Code Playgroud)