プライマリサーバーから404を取得した場合、リソースに対して2番目のサーバーを試すようにワニスを構成できますか?
-
29-09-2019 - |
質問
これは、Webブラウザーにいくつかの生成されたコンテンツを提供する必要があるため、私にとって完璧なソリューションです。私の計画は、オンデマンドでコンテンツを生成し、次回は保存することです。ブラウザが毎回私のサービス(コンテンツを生成する)を呼び出すことは望ましくありません。利用可能な場合は、「キャッシュされた」リソースに直接移動してもらい、サービスがない場合にのみサービスに電話してほしい。そこで、以前に生成されたコンテンツバージョンを保存するサービスとサーバーBを実行するサーバーAの前にVarinshを配置します。リソースのリクエストを取得した場合、キャッシュされていませんサーバーBを試してみます。404応答を取得すると、サーバーAから同じリソースをリクエストします。
VCLを使用して、ワニスをそのような方法で構成できますか?そうでない場合、あなたが知っているような解決策はありますか?
PSブラウザに302リダイレクトを送信したくないプラスサーバーBをコントロールして、404の代わりにそのようなリダイレクトを送信するようにします
解決
これはワニスで完全に可能です。 VCL_FETCH(およびVCL_ERRORで)では、RETURN STATUSコード(ステータス> 400をチェックするなど)を確認し、障害がある場合は再起動を行い、VCL_RECVでは、Req.restarts> 0の場合は他のバックエンドを選択してください。
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;
}
}
しかし、そうは言っても、キャッシュサーバーの概念を再発明しているように聞こえます。ワニスは優れたキャッシュサーバーです。バックエンドサーバー(Servera)を1つ持っていて、生成されたエンティティをワニスキャッシュにしてみませんか?複雑なルールをセットアップでき、(キャッシュの)有効期限、パージ管理、パフォーマンスを無料で取得できます。 :)
他のヒント
この例では、ワニスを試してみてください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);
}
}