我正在尝试设置 haproxy 以在同一服务器上运行的多个应用程序之间导航。如果我的理解正确,我应该能够使用前端的 ACL 规则根据传递给它的路径在端口之间切换。但是,每次我尝试时,我都会得到503 Service Unavailable
。我使用的是 HAProxy 1.5.18 版本,并已确认我想要的服务已在正确的端口上启动并运行。我的配置文件是:
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
#log loghost local0 info
maxconn 4096
#debug
#quiet
user root
group root
#/installs version
defaults
log global
mode http
retries 3
timeout client 50s
timeout connect 5s
timeout server 50s
option tcplog
balance roundrobin
# Set up application listeners here.
listen admin
bind 127.0.0.1:22002
mode http
stats enable
stats show-node
stats uri /admin
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl configuration-path path -i /configuration
use_backend servers-configuration if config-path
acl payment-path path -i /payment
use_backend servers-paymentdate if payment-path
acl employee-path path -i /employee
use_backend servers-employeename if employee-path
backend servers-configuration
server www.server1.com 12.12.12.12:3000 maxconn 100
backend servers-paymentdate
server www.server1.com 12.12.12.12:3001 maxconn 100
backend servers-employeename
server www.server1.com 12.12.12.12:3001 maxconn 100
例如,如果我尝试:
12.12.12.12:3000/config/id
我能够得到我期望的结果。然而,当我尝试
12.12.12.12:4000/configuration
#or
12.12.12.12:4000/configuration/config/to/service
失败了。到目前为止,我能够从其中一条路径获取结果的唯一方法是删除它的 acl 规则并包含一个默认后端:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment-path path -i /payment
use_backend servers-paymentdate if payment-path
acl employee-path path -i /employee
use_backend servers-employeename if employee-path
default_backend servers-configuration
这让我可以使用路径:
12.12.12.12:4000/config/id
但这显然不适用于所有人。有人能告诉我我错在哪里吗?
答案1
我明白了。为了让 ACL 正常工作,我需要输入服务的完整路径:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment_path path_beg -i /payment/list
use_backend servers-paymentdate if payment-path
acl employee-path path_beg -i /employee/list
use_backend servers-employeename if employee-path
这并不理想,所以我正在研究正则表达式在这些 acl 中的工作方式。
编辑:能够解决这个问题。我只需要设置一个 path_reg:
frontend http
maxconn 2000
bind 0.0.0.0:4000
acl payment_path path_beg -i /payment.*
use_backend servers-paymentdate if payment-path
acl employee-path path_beg -i /employee.*
use_backend servers-employeename if employee-path
答案2
如果您使用,path_beg -i
则正则表达式.*
不是必需的。正如path_beg -i
已经暗示的那样,以某个字符串开头的 URL 即 /payment 将匹配以 /payment 开头的任何 URL。这里-i
表示匹配是忽略大小写的。以下是从 HaProxy 官方网站中提取的文档片段这里:(该页面已被弃用,因为 HaProxy 1.5 现在已经很旧了)
ACL derivatives :
path : exact string match
path_beg : prefix match
path_dir : subdir match
path_dom : domain match
path_end : suffix match
path_len : length match
path_reg : regex match
path_sub : substring match