プライマリサーバーから404を取得した場合、リソースに対して2番目のサーバーを試すようにワニスを構成できますか?

StackOverflow https://stackoverflow.com/questions/4327874

  •  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);
   }

}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top