HAProxy: API auf derselben Subdomain wie das Frontend

HAProxy: API auf derselben Subdomain wie das Frontend

Ich habe eine solche Konfiguration in meiner haproxy.cfgDatei:

    acl is_api url_beg -i /api
    acl is_frontend hdr(host) -i subdomain.mydomain.com

    use_backend api if is_api
    use_backend nginx-frontend if is_frontend

Mein Ziel:

Wenn Sie auf klicken, subdomain.mydomain.comwerden Dateien bereitgestellt, nginxes sei denn, sie pathbeginnen mit /api( subdomain.mydomain.com/api/*) – dann sollte mein apiBackend verwendet werden.

Wenn ich den Dienst nun mit der aktuellen Konfiguration neu starte haproxy, gibt es zwei Szenarien:

  1. Ich gehe zu subdomain.mydomain.com– es funktioniert nginx-frontend– großartig. Dann gehe ich zu subdomain.mydomain.com/api– 404 ( nginxwurde verwendet).

  2. Ich gehe zu subdomain.mydomain.com/apiseinem Server api– großartig. Dann gehe ich zu subdomain.mydomain.com– 404 (das apiBackend wurde verwendet).

Abhängig von der Reihenfolge meines ersten Besuchs auf der einen oder anderen Seite werden alle Anfragen an meine Subdomäne dem einen oder anderen Backend zugewiesen ...

Ich bin ein absoluter Neuling. Es tut mir leid, wenn das eine dumme Frage ist.

Irgendeine Hilfe?

Antwort1

OK, ich habe einen Weg gefunden ... aber in nginxder Konfiguration ( /etc/nginx/sites-enabled/default):

server {
    listen 8080 default_server;
    listen [::]:8080 default_server ipv6only=on;

    server_name subdomain.mydomain.com;
    location /api {
            proxy_pass http://127.0.0.1:4001;
    }

    location / {
            try_files $uri $uri/ =404;
    }
}

und in haproxy.cfgder Datei:

backend nginx
    server nginx-1 127.0.0.1:8080 check

frontend all
    bind *:80
    mode http

    acl is_frontend hdr(host) -i subdomain.mydomain.com
    use_backend nginx if is_frontend

    # other frontends...

Wenn jemand kommentieren könnte, ob das ein guter Ansatz ist, wäre ich dankbar!

Antwort2

Es gibt 404 wegen url_beg. Dies verwendet die vollständige URL und nicht den nachfolgenden Teil nach der Domäne, d. h. es gelangt "http..."inhttp://subdomain.mydomain.com/api

url_beg Gibt true zurück, wenn die URL mit einer der Zeichenfolgen beginnt. Damit kann überprüft werden, ob eine URL mit einem Schrägstrich oder mit einem Protokollschema beginnt.

Verwenden Sie path_begstattdessen.

frontend fe
  ...
  acl is_api path_beg -i /api
  acl is_frontend hdr(host) -i subdomain.mydomain.com

  use_backend api if is_api
  use_backend nginx-frontend if is_frontend !is_api

verwandte Informationen