
同じサーバー上で実行されている複数のアプリケーション間を移動するために 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
失敗します。これまでのところ、パスの 1 つから結果を取得できる唯一の方法は、その 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