複数のバックエンド ポートへの 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

失敗します。これまでのところ、パスの 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

関連情報