5

生成されたコンテンツを Web ブラウザーに提供する必要があるため、これは私にとって完璧なソリューションです。私の計画は、オンデマンドでコンテンツを生成し、次回のために保存することです。ブラウザーが (コンテンツを生成する) 私のサービスを毎回呼び出すのは望ましくありません。利用可能な場合は「キャッシュされた」リソースに直接アクセスし、利用できない場合にのみサービスを呼び出すようにします。したがって、サービスを実行するサーバー A と、以前に生成されたコンテンツ バージョンを格納するサーバー B の前に Varinsh を配置します。キャッシュされていないリソースのリクエストを受け取った場合、サーバー B を試します。404 応答を取得すると、サーバー A から同じリソースをリクエストします。

Varnish を VCL でそのように設定できますか? そうでない場合、あなたが知っているような解決策はありますか?

PS ブラウザに 302 リダイレクトを送信したくありません。また、404 の代わりにそのようなリダイレクトを送信するようにサーバー B を制御することもできません。

4

2 に答える 2

5

これは Varnish で完全に可能です。vcl_fetch (および場合によっては vcl_error) でリターン ステータス コードを確認し (たとえば、status > 400 を確認)、失敗した場合は再起動を行い、req.restarts > 0 の場合は vcl_recv で他のバックエンドを選択します。例:

backend serverA {
   .host="192.168.0.1";
   .port = "80";
}

backend serverB {
   .host = "192.168.0.2";
   .port = "80";
}

sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverB;
   } else {
       set req.backend = serverA;
   }
}

sub vcl_fetch {
    if (obj.status >= 400 && req.restarts == 0) {
        restart;
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       restart;
   }
}

しかし、そうは言っても、キャッシュ サーバーの概念を再発明しているように思えます。Varnish は優れたキャッシュ サーバーです。1 つのバックエンド サーバー (serverA) を用意して、生成されたエンティティを Varnish にキャッシュさせてみませんか? 複雑なルールを設定でき、(キャッシュの) 有効期限、パージ管理、パフォーマンスを無料で利用できます! :)

于 2010-12-03T14:43:19.200 に答える
0

この例では、varnish は 6 つのサーバーで検索を試行し、見つからない場合は最後のメッセージを表示します。

# cat /etc/varnish/default.vcl 
backend serverA {
   .host="10.42.4.104";
   .port = "80";
}

backend serverB {
   .host = "10.42.4.102";
   .port = "80";
}

backend serverC {
   .host = "10.42.4.103";
   .port = "80";
}

backend serverD {
   .host = "10.42.4.101";
   .port = "80";
}

backend serverE {
   .host = "10.42.4.105";
   .port = "80";
}

backend serverF {
   .host = "10.42.4.106";
   .port = "80";
}




sub vcl_recv {
   if (req.restarts == 0) {
       set req.backend = serverA;
   } elseif (req.restarts == 1){
       set req.backend = serverB;
   } elseif (req.restarts == 2){
       set req.backend = serverC;
   } elseif (req.restarts == 3){
       set req.backend = serverD;
   } elseif (req.restarts == 4){
       set req.backend = serverE;
   } else {
       set req.backend = serverF;
   }
}


sub vcl_fetch {
    if (beresp.status >= 400 && req.restarts == 0) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 1) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 2) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 3) {
        return(restart);
    }
    if (beresp.status >= 400 && req.restarts == 4) {
        return(restart);
    }
}

sub vcl_error {
   if (req.restarts == 0) {
       return(restart);
   }
   if (req.restarts == 1) {
       return(restart);
   }
   if (req.restarts == 2) {
       return(restart);
   }
   if (req.restarts == 3) {
       return(restart);
   }
   if (req.restarts == 4) {
       return(restart);
   }

}
于 2015-01-20T15:39:00.707 に答える