【发布时间】:2014-09-07 04:50:45
【问题描述】:
我正在尝试设置一个 Haproxy 以在 uri 路径标识的几个后端上负载平衡请求。例如:
应该导致“catalog-v1”后端。
问题是每个应用程序响应不同的路径,所以我不仅要识别应用程序,还要重写 URL 路径。例如
- https://www.example.com/v1/catalog/product
- https://www.example.com/v2-2/checkout/cart/123
- https://www.example.com/v3.1.2/checkout/cart
到
- https://www.example.com/catalog-v1/product
- https://www.example.com/checkout-v2-2/cart/123
- https://www.example.com/checkout-v3.1.2/cart
我知道我不应该将 Haproxy 用于重写,但目前这是不可避免的。
尝试了以下适用于 regex101 的正则表达式:
([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*)
替换:
\1/\3-\2/\4
最后是 haproxy.config:
global
daemon
user root
group root
maxconn 256000
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
stats socket /run/haproxy/stats.sock mode 777 level admin
defaults
log global
option dontlognull
maxconn 4000
retries 3
timeout connect 5s
timeout client 1m
timeout server 1m
option redispatch
balance roundrobin
listen stats :8088
mode http
stats enable
stats uri /haproxy
stats refresh 5s
backend catalog-v1
mode http
option httpchk GET /catalog-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4
server 127.0.0.1:8280_catalog-v1-node01 127.0.0.1:8280 check inter 2s rise 3 fall 2
backend checkout-v1
mode http
option httpchk GET /checkout-v1/ping
http-check expect status 200
reqrep ([a-z.]*)\/([a-z0-9\-\.]*)\/([a-z\-]*)\/(.*) \1/\3-\2/\4
server 127.0.0.1:8180_checkout-v1-node01 127.0.0.1:8180 check inter 2s rise 3 fall 2
frontend shared-frontend
mode http
bind localhost:80
acl is-catalog-v1-path path_dir /v1/catalog
acl is-checkout-v1-path path_dir /v1/checkout
use_backend catalog-v1 if is-catalog-v1-path
use_backend checkout-v1 if is-checkout-v1-path
我错过了什么吗?
我已经为此苦苦挣扎了很长一段时间,但没有成功。后端在 Haproxy 统计页面中显示“UP”,但每次我调用“非重写 url”时,我都会收到 400 Bad Request 错误。
提前感谢您的帮助!
【问题讨论】:
-
为什么“不应该使用 Haproxy 进行重写”?
标签: regex path rewrite load-balancing haproxy