0

名前ベースの仮想ホストを使用してApache2をリバースプロキシとして設定し、リクエストをバックエンドサーバーにルーティングする方法を決定したいと思います。十分に単純です。

問題は、これらのバックエンドサーバーが動的に追加および削除される可能性があることです。私の最初のアイデアは、Apache構成ファイルをプログラムで書き直しapachectl graceful、バックエンドサーバーが起動または停止するたびに呼び出すことでした。これは正しい解決策のようには思えません。これを達成するためのより良い方法は何ですか?

名前の処理を別のバックエンドサーバーに適切に転送できる必要があります。たとえば、Backend-Server-Aがexample.comのリクエストを処理している可能性があります。監視プロセスにより、Backend-Server-Aが古くなっていると判断される場合があります(メモリ使用量が多すぎる、example.comを処理するための新しいバージョンのサーバーコードがあるなど)。監視プロセスはBackend-Server-Bを開始し、example.comのリクエストをまもなく処理します。Apacheは、example.comなどの新しいリクエストをBackend-Server-Bに送信する必要がありますが、Backend-Server-Aが現在処理されている保留中のリクエストは、Backend-Server-Aがシャットダウンされる前に完了できるようにします。

更新サーバー障害に投稿

4

1 に答える 1

1

頭に浮かぶ唯一のことは、RewriteRule への P フラグを介して、どのマシンに移動するかを決定する RewriteMap スクリプトを使用することです。

#!/usr/bin/perl
#This is /usr/bin/requestdistributor.pl
$| = 1; # Turn off buffering
while (<STDIN>) {
        print distributeRequest($_);
}
sub distributeRequest {
    my $request = shift;
    #do whatever you have to do to find the proper machine for the request,
    #return the complete URL with a trailing newline
}

次に、Apache構成ファイルで

RewriteMap distributeRequests prg:/usr/bin/requestdistributor.pl 
RewriteRule (.*) ${distributeRequests:$1} [P]

#Setup the reverse proxying for all machines, use the proper URLs
ProxyPassReverse / http://machine1
ProxyPassReverse / http://machine2
#and so on...
ProxyPassReverse / http://machineN

警告: これはテストされていないため、いくつかの欠陥がある可能性があります。新しいサーバーを追加するときに新しい ProxyPassReverse を追加する必要があります (そして適切に実行する必要があります)。 ProxyPassReverse 行さえ必要ありません。それで、これをテストして、うまくいったかどうか教えてください。

于 2009-10-29T06:45:59.997 に答える