web-dev-qa-db-ja.com

Varnishで複数のサイトを構成する

ワニスを介して複数のドメインを提供する必要があるサーバーがあります。 example1.com、example2.comおよびexample3.com

現在の.vclファイルは次のようになります。

sub vcl_recv {
  set req.http.Host = "example1.com";    
  lookup;
}

正しい着信要求に対して正しいreq.http.Hostを設定するにはどうすればよいですか?

48
Tom

この方法で複数のフロントエンドドメインをサポートできます。

 backend example1 {
     .Host = "backend.example1.com";
     .port = "8080";
 }
 backend example2 {
      .Host = "backend.example2.com";
      .port = "8080";
 }
 sub vcl_recv {
    if (req.http.Host == "example1.com") {
        #You will need the following line only if your backend has multiple virtual Host names
        set req.http.Host = "backend.example1.com";
        set req.backend = example1;
        return (lookup);
    }
    if (req.http.Host == "example2.com") {
        #You will need the following line only if your backend has multiple virtual Host names
        set req.http.Host = "backend.example2.com";
        set req.backend = example2;
        return (lookup);
    }
 }
87
Cristian Vidmar

私はCristianのセットアップと同様のセットアップを使用していますが、if句ではreq.http.Hostを正規表現と照合します。

#for www.example.com or example.com
if (req.http.Host ~ "^(www\.)?example\.com$") {
        set req.backend = example_com;
        return (lookup);
}

#with any subdomain support
if (req.http.Host ~ "^(.*\.)?example2\.com$") {
        set req.backend = example2_com;
        return (lookup);
}

バックエンドを適切に設定することを忘れないでください!

25
msurovcak

コメントを追加できないので、ここに行きます

ワニス4のわずかな変更

#for www.example.com or example.com
if (req.http.Host ~ "^(www\.)?example\.com$") {
        set req.backend_hint = example_com;
        return (lookup);
}

#with any subdomain support
if (req.http.Host ~ "^(.*\.)?example2\.com$") {
        set req.backend_hint = example2_com;
        return (lookup);
}

バックエンドをbackend_hintに置き換えます

8
hyena

Cristian Vidmarとmsurovcakの投稿の両方にもう少し詳細を追加したい

「(req.http.Host == "example1.com")」パターン:

サーバーごとに数十から数百のサイトをホストするために説明したパターンを使用しました。

構成全体(vcl_fetch/vcl_backend_response、vcl_hashなど)でサイト固有のカスタムルールを使用して続行できます。

if (req.http.Host == "example1.com") {

必要な場所の例。

これをテンプレートエンジンと組み合わせて、独自のロジックを含む個別のファイルを介して顧客固有の構成を管理できるようにします(すべて、サイト固有のifブロックでラップしてコードを分離します)。

次に、以下を使用して、個々のサイトブロックをdefault.vclに含めます。

include "/etc/varnish/www.example1.com.vcl";

バックエンドを完全に分割するオプションの拡張機能:

まったく異なるWebサイトをホストしている場合は、分割バックエンド(および分割キャッシュ)が適しています。

サイトが類似している場合(同じcodebase/js/css/images)、リソースドメインを実行すると興味深い場合があります。すべてのサイトが使用するresources.example.com。

その後、複数のサイトの共通要素のそれぞれにわたって単一のキャッシュ(および非常に高いヒット率)を保持しながら、個々のwwwサイトの違いを維持できます。

スプリットバックエンドを使用する別の方法:

別のオプションは、コンテナを介してニスのインスタンスを分割することです。そして、それぞれが個別に管理される(そして生きて死ぬ)独自の孤立した世界になります。これは優れた安全オプションであり、複数のプロセスのオーバーヘッドは最新のインフラストラクチャで最小限に抑えられます。

これのいくつかの利点は、インスタンスごとに異なるバージョンのVarnishおよび異なるVarnish起動パラメーターをサポートできることです。

これは、インスタンスごとに異なるESIモードおよび個々のメモリ/チューニング構成設定を活用して、個々のロギングに最適です。

これは www.section.io で行います。また、地理的に分散したユーザーベースにできるだけ近づけるために、地理的に異なる場所で異なるコンテナまたは異なる場所で同じコンテナを実行する機能も提供します。

4
mattnthat