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已經暗示的那樣,以特定字串(即/ payment)開頭的url將匹配以/ 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

相關內容