
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 -i
bereits angedeutet, wird eine URL, die mit einer bestimmten Zeichenfolge beginnt, d. h. /payment, mit jeder URL übereinstimmen, die mit /payment beginnt. Hier -i
wird 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