web-dev-qa-db-ja.com

プロキシではなくリダイレ​​クトを使用したNginxでの負荷分散

少し型破りな方法でNginxを使いたいです。いくつかのサーバー間で負荷分散を行いたいのですが、それらのサーバーのプロキシコンテンツではなく、それらのサーバーにリダイレクトしたいと思います。

つまり、リクエストがNginxサーバーに届いた場合、アップストリームブロックまたは同等のものからランダムに1つを選択して、別のサーバーにリダイレクトする必要があります。重み付けなど、他のアップストリームブロック機能も必要ありません(ただし、可能であれば、それらを使用できるようにしても問題はありません)。

今のところ、私は次の設定を持っています。これは必要なことを実行しますが、少し醜いです:

upstream boxes {
        server 127.0.0.1:46011;
        server 127.0.0.1:46012;
}

server {
        listen 46011;
        return 302 http://box11.example.com$request_uri;
}

server {
        listen 46012;
        return 302 http://box12.example.com$request_uri;
}

server {
        listen 80;
        server_name example.com;

        location / {
                proxy_pass http://boxes;
        }
}

自分自身にプロキシすることなく、この状況を処理する簡単な方法はありますか?

3
Brad

その他のモジュールから確率変数を取得できます。

set_random $loc_rnd 1 10;

次に、単純な重み付けを使用して、それに基づいて内部の場所を選択します。

map $loc_rnd $loc_redirect {
  1 @server1;
  2 @server1;
  ...
  8 @server2;
  9 @server2;
 10 @server2;
}

location / {
 recursive_error_pages on;
 error_page 403 = $loc_redirect;
 return 403;
}

リダイレクト:

location @server1 {
  internal;
  return 302 http://box11.example.com$request_uri;
}

location @server2 {
  internal;
  return 302 http://box11.example.com$request_uri;
}

その他のバリアント:return 302 $ some_variableを使用します。 (およびマップ内の完全なURL)「/」の場所に直接。

4
kupson