Nginx: Upstream mit mehreren Server-Direktiven?

14

Ich versuche, 2 Anwendungen, die Nginx als Proxy verwenden, zu packen und jeweils eine Konfigurationsdatei in zu liefern /etc/nginx/conf.d/.

Dies in einer Datei ( combined.conf) zu tun, funktioniert hervorragend:

    upstream backend1 {
      http://localhost:8989;
    }

    upstream backend2 {
      http://localhost:8990;
    }

    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
      location /backend2/ {
        proxy_pass  http://backend2;
      }

Beim Aufteilen in zwei Dateien schlägt jedoch eine der Umleitungen systematisch fehl:

  • backend1.conf:

    upstream backend1 {
      http://localhost:8989;
    }
    
    server {
      location /backend1/ {
        proxy_pass  http://backend1;
      }
    
  • backend2.conf:

    upstream backend2 {
      http://localhost:8990;
    }
    
    server {
      location /backend2/ {
        proxy_pass  http://backend2;
      }
    

Meine Frage ist also: Kann ein httpKnoten zwei verschiedene serverKinder haben?

Die Nginx- Dokumentation sagt nichts darüber aus.

Anderen scheint diese Art von Architektur jedoch gelungen zu sein :(

Die Nginx-Version ist 1.1.19-1ubuntu0.1.

Danke für jeden Rat!

oDDsKooL
quelle
Um genauer zu sein, wenn ich den 2-Dateien-Ansatz verwende, ist dies die Standard-Site, die mit 404 antwortet.
oDDsKooL

Antworten:

8

Nachdem ich so rumort und getestet habe, habe ich mir einen Weg ausgedacht, wie ich es zum Laufen bringen kann und in der Lage bin, eine Konfigurationsdatei pro Anwendung zu versenden.

Hier ist es, verteilt auf eine gemeinsame Datei und ein Paar Upstream- / Standortdateien pro Anwendung:

  • /etc/nginx/conf.d/common-proxies.conf:

    include /upstreams/*.conf;
    
    server {
    include /locations/*.conf
    }
    
  • /etc/nginx/locations/backend1.conf

    location /backend1/ {
      upstream http://backend1;
    }
    
  • /etc/nginx/locations/backend2.conf

    location /backend2/ {
      upstream http://backend2;
    }
    
  • /etc/nginx/upstreams/backend1.conf

    upstream backend1 {
      http://localhost:8989;
    }
    
  • /etc/nginx/upstreams/backend2.conf

    upstream backend2 {
      http://localhost:8990;
    }
    
oDDsKooL
quelle
1
Ist das ein Tippfehler? Upstream sollte "server localhost: 8990" anstelle von " localhost: 8990 ;" haben. Siehe hier: nginx.org/en/docs/http/ngx_http_upstream_module.html
mbdev
Aus dem von Ihnen verknüpften Dokument geht hervor, dass jeder Befehl in einem Block durch eine Semispalte beendet wird. Eg upstream backend { server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; }. Dies funktioniert auch mit der ;:)
oDDsKooL
Ich meinte, dass das Schlüsselwort "Server" vor der Adresse fehlt. Ignorieren Sie das Semikolon.
mbdev
1

Ein http-Block kann viele untergeordnete Server haben. Nginx wählt jedoch einen Serverblock aus, um eine Anforderung zu verarbeiten. Die Anforderung "sieht" also nie den Speicherort von Backend2, da er mit dem ersten Serverblock übereinstimmt.

chrskly
quelle
Du meinst, wahrscheinlich ist es meine locationDirektive, die die für backend2 bestimmte Anfrage nervt und packt?
oDDsKooL
Oder ist es so, dass ich beide serverBlöcke unterscheiden muss , wenn nginx nach dem passenden sucht server, um die Anfrage weiterzuleiten?
oDDsKooL
Beide Standortblöcke sollten sich innerhalb desselben Serverblocks befinden.
Chrskly