Nginxは引数に応じてアップストリームを選択します

Nginxは引数に応じてアップストリームを選択します

2 つの異なるアップストリーム セットが必要です。ただし、すべてのリクエストは同じ 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

私はこれの別のバージョンを提案したいif なし声明。これは古い質問であることは承知していますが、将来の Google ユーザーにはまだ役立つかもしれません。

確かに、アップストリームの選択方法を変更することも意味します。しかし、これを行うことに問題はないと思います。

アイデアとしては、リクエストとともにカスタム 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

あなたはもし含まれるパラメータをテストする$引数

関連情報