HAProxy ACL für mehrere Backend-Ports funktioniert nicht

HAProxy ACL für mehrere Backend-Ports funktioniert nicht

Ich versuche, Haproxy so einzurichten, dass es zwischen den mehreren Anwendungen navigieren kann, die auf demselben Server laufen. Wenn ich das richtig verstehe, sollte ich in der Lage sein, ACL-Regeln im Frontend zu verwenden, um basierend auf dem übergebenen Pfad zwischen Ports zu wechseln. Allerdings erhalte ich jedes Mal, wenn ich es versuche, die Meldung 503 Service Unavailable. Ich verwende Version 1.5.18 von HAProxy und habe bestätigt, dass die gewünschten Dienste auf den richtigen Ports laufen. Meine Konfigurationsdatei lautet:

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

Wenn ich beispielsweise versuche:

12.12.12.12:3000/config/id

Ich kann die erwarteten Ergebnisse erzielen. Wenn ich jedoch versuche

12.12.12.12:4000/configuration
#or
12.12.12.12:4000/configuration/config/to/service

Es schlägt fehl. Bisher konnte ich nur Ergebnisse von einem der Pfade erhalten, indem ich die ACL-Regel dafür entfernte und ein Standard-Backend einfügte:

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

Dadurch kann ich den Pfad verwenden:

12.12.12.12:4000/config/id

Das wird aber offensichtlich nicht bei allen funktionieren. Kann mir jemand sagen, was ich falsch gemacht habe?

Antwort1

Ich habe es herausgefunden. Damit die ACL funktioniert, muss ich den vollständigen Pfad für den Dienst eingeben:

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

Das ist nicht ideal, deshalb schaue ich mir an, wie reguläre Ausdrücke in diesen ACLs funktionieren.

Bearbeiten: Konnte das herausfinden. Ich musste nur ein path_reg einrichten:

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

Antwort2

Wenn Sie verwenden path_beg -i, ist kein regulärer Ausdruck .*erforderlich. Wie path_beg -ibereits angedeutet, wird eine URL, die mit einer bestimmten Zeichenfolge beginnt, d. h. /payment, mit jeder URL übereinstimmen, die mit /payment beginnt. Hier -iwird angegeben, dass die Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung durchgeführt wird. Nachfolgend finden Sie die Dokumentausschnitte, die von der offiziellen Website von HaProxy extrahiert wurden.Hier: (Seite ist allerdings veraltet, da HaProxy 1.5 mittlerweile ziemlich alt ist)

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

verwandte Informationen