web-dev-qa-db-ja.com

URLの一部のコンポーネントに基づくHTTPS負荷分散

複数のサーバーに分割したい既存のアプリケーションがあります(たとえば、合計1000ユーザー、10サーバーに分割された100ユーザー)。

理想的には、URLの一部のコンポーネントに基づいて、HTTPS要求を特定のサーバーに中継できるようにする必要があります。例:ユーザー1から100は http://server1.domain.com/ ユーザー2から200は http://server2.domain.com/ などに移動しますなどなど。

着信リクエストは次のようになります: https://secure.domain.com/user/ {integer user#goes here}/path/to/file

誰かがこれを行う簡単な方法を知っていますか? ポンド 有望に見えます...しかし、このようなURLに基​​づくルーティングをサポートしているようには見えません。

ハードコーディングする必要がない場合はさらに良いでしょう-ロードバランサーは別のサーバーに別のHTTPリクエストを送信して、「ねえ、URLへのリクエストをどのサーバーに中継する必要があるか{リクエストされたURLここに行く}?」 HTTP応答で返されたホスト名に中継します。

3

ワニス おそらくそれを行うでしょう。ここで説明した他のオプションと同様に、SSLターミネーターとして機能するには、その前にポンドのようなものが必要です。ただし、完了したら、各実サーバーを「バックエンド」としてセットアップし、次のようなものを構成に追加できます。

 ##バックエンドサーバーを定義します。
 backendserver01 {
。Host = "192.0.2.1"; 
。port = "80"; 
} 
 backend server02 {
。Host = "192.0.2.2"; 
。port = "80"; 
} 
 
 sub vcl_recv {
 if(req.url〜 "^/1 [0-9] [0-9] /"){
##リンクの最初の部分が100-199 use server01 
 set req.backend = server01; 
 pipe; 
} else if(req.url〜 "^/2 [0-9] [0-9 ]/"){
 ##リンクの最初の部分が200-299の場合は、server02 
 set req.backend = server02; 
 pipe; 
}を使用します。 else {
 ##他のすべてが失敗した場合はserver01 
にフォールバックしますsetreq.backend = server01; 
 pipe; 
} 
} 

これは関連するセクションの抜粋であり、おそらく設定でさらに必要になるでしょう。たとえば、静的ファイルをキャッシュするためにsub vcl_recv {の直後に次を追加して、変更されないファイルがサーバーに毎回ヒットしないようにすることができます。

 if(req.request == "GET" && req.url〜 "\。(png | jpg | gif | css)$"){
 lookup; 

小さなインラインCプログラムを構成に追加して、外部サービスと通信し、使用するバックエンドを決定することもできます。

2
Niall Donegan

squid -プロキシの前でSSLを終了する必要があることに注意してください(例: stunnel )。

1
symcbean

利用可能なコーディングリソースはありますか?私はミドルサーバー上の小さなプログラムを使用してこれをほぼ正確に実行しました。 URIからユーザーIDを抽出し、DBルックアップを実行してファイルの場所を見つけ、ファイルをフェッチして、ユーザーに書き戻します。 Javaサーブレットを使用して実行しましたが、同じことを実行するための他のオプションがたくさんあります。

0
JOTN

HAProxyはあなたが求めていることを行います。 URLのコンテンツに基づいてレイヤー7ルーティングを実行する機能があり、オープンソースです。

0
blueben