web-dev-qa-db-ja.com

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のいずれかを使用します。

どうすればこれを実装できますか?

ありがとう!

@hellvinzは正しいです。コメントできないので、別の答えを出します。

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

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

$ myArgをテストしているクエリパラメータの名前に変更し、otherPoolを設定した名前に変更する必要があると思います。さらに、書き換えはテストされていないので、私も間違っているかもしれませんが、あなたはその考えを理解しています。

3
Paul DeBruicker

このifなしステートメントの代替バージョンを提案したいと思います。これは古い質問だと思いますが、将来のグーグルはこれが役立つかもしれません。

私はそれがあなたが上流を選択する方法を変えることも意味することを認めなければなりません。しかし、これを行うことに問題は見られません。

アイデアは、リクエストとともにカスタム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を使用 )にインストールできます。

1
Zunderscore

if を使用して、 $ arg に含まれるパラメーターをテストできます。

0
hellvinz