HAProxy ACL 到多个后端端口不起作用

HAProxy ACL 到多个后端端口不起作用

我正在尝试设置 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

相关内容