
我正在嘗試設定 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