Nginx выбирает апстрим в зависимости от аргументов

Nginx выбирает апстрим в зависимости от аргументов

Мне нужно два разных набора апстримов. Но все мои запросы приходят с одного и того же URL (одного и того же пути). Разница в том, что некоторые запросы будут иметь специальный аргумент, а некоторые — нет. В зависимости от этого мне нужно будет выбрать, какой апстрим использовать. Вот неполная часть примера моего файла конфигурации:

  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;
    }

Итак... часть, которую я не знаю, это как проверить, есть ли аргумент/параметр в URL, и в зависимости от этого использовать либо местоположение pool1, либо pool2.

Есть идеи, как это реализовать?

Спасибо!

решение1

@hellvinz прав. Я не могу комментировать, поэтому пишу еще один ответ.

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

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

Думаю, вам придется изменить $myArg на имя параметра запроса, который вы тестируете, а otherPool на то, что вы ему задали. Плюс, перезапись не протестирована, так что я тоже могу ошибаться, но вы поняли.

решение2

Я хотел бы предложить альтернативную версию этогобез еслизаявление. Я знаю, что это старый вопрос, но будущие гуглеры все еще могут найти это полезным.

Я должен признать, что это также означает изменение способа выбора восходящего потока. Но я не вижу в этом проблемы.

Идея заключается в отправке пользовательского заголовка HTTP (X-Server-Select) с запросом. Это позволяет nginx выбрать правильный пул. Если заголовок отсутствует, будет выбран пул по умолчанию.

Ваша конфигурация может выглядеть примерно так:

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;
}

Источник:nginx использует разные бэкэнды в зависимости от http-заголовка

Добавлено после того, как я вернулся к этому вопросу в качестве будущего пользователя: Чтобы легко тестировать серверы, вы можете установить расширение в Chrome (Я использую ModHeader), который позволяет изменять заголовки запросов.

решение3

Вы можете использоватьеслитестирование параметра, содержащегося в$арг

Связанный контент