Nginx wählt Upstream abhängig von Argumenten

Nginx wählt Upstream abhängig von Argumenten

Ich brauche zwei verschiedene Upstream-Sets. Aber alle meine Anfragen kommen von derselben URL (demselben Pfad). Der Unterschied besteht darin, dass einige Anfragen ein spezielles Argument haben und andere nicht. Abhängig davon müsste ich entscheiden, welchen Upstream ich verwenden möchte. Hier ist ein unvollständiger Teil eines Beispiels meiner Konfigurationsdatei:

  server_name localhost;

    root /var/www/something/;

  upstream pool1 
  {
    server localhost:5001;
    server localhost:5002;
    server localhost:5003;
  }


 upstream pool2
  {
    server localhost:6001;
    server localhost:6002;
    server localhost:6003;
  }


   location /
    { 
 # this is the part where I need help 
        try_files $uri @pool1;

    }

 location @pool1
    {
      include fastcgi_params;
      fastcgi_pass pool1;
    }


location @pool2
    {
      include fastcgi_params;
      fastcgi_pass pool2;
    }

Also … ich weiß nicht, wie ich überprüfen kann, ob das Argument/der Parameter in der URL enthalten ist, und abhängig davon entweder den Standort Pool1 oder Pool2 verwenden kann.

Irgendeine Idee, wie ich das umsetzen kann?

Danke!

Antwort1

@hellvinz hat recht. Ich kann nichts dazu sagen, also schreibe ich eine andere Antwort.

location / {
   if($myArg = "otherPool") {
       rewrite  ^/(.*)$ /otherUpstream/$1 last;
     } 
   try_files $uri pool1;
}

location /otherUpstream {
     proxy_pass http://@pool2;
}

Ich denke, Sie müssen $myArg in den Namen des Abfrageparameters ändern, den Sie testen, und otherPool in den von Ihnen festgelegten Wert. Außerdem ist die Neufassung ungetestet, also kann es sein, dass ich das auch falsch gemacht habe, aber Sie verstehen, was ich meine.

Antwort2

Ich möchte eine alternative Version davon vorschlagenohne wennAussage. Ich weiß, dass dies eine ältere Frage ist, aber zukünftige Googler finden sie möglicherweise trotzdem hilfreich.

Ich muss zugeben, dass dies auch bedeutet, dass Sie die Art und Weise ändern müssen, wie Sie den Upstream auswählen. Aber ich sehe darin kein Problem.

Die Idee besteht darin, einen benutzerdefinierten HTTP-Header (X-Server-Select) mit der Anfrage zu senden. Dadurch kann nginx dann den richtigen Pool auswählen. Wenn der Header nicht vorhanden ist, wird ein Standard ausgewählt.

Ihre Konfiguration könnte etwa wie folgt aussehen:

upstream pool1 
{
  server localhost:5001;
  server localhost:5002;
  server localhost:5003;
}
upstream pool2
{
  server localhost:6001;
  server localhost:6002;
  server localhost:6003;
}

# map to different upstream backends based on header
map $http_x_server_select $pool {
    default "pool1";
    pool1 "pool1";
    pool2 "pool2";
}

location /
{
  include fastcgi_params;
  fastcgi_pass $pool;
}

Quelle:Nginx verwendet basierend auf dem HTTP-Header ein anderes Backend

Hinzugefügt, nachdem ich als zukünftiges Ich hierher zurückgekommen bin: Um Server einfach zu testen, können Sie eine Erweiterung in Chrome installieren (Ich benutze ModHeader), mit dem Sie Anforderungsheader ändern können.

Antwort3

Sie können einWennTesten des Parameters, der enthalten ist in$arg

verwandte Informationen