52

ワニスを介して複数のドメインにサービスを提供する必要があるサーバーがあります(例:example1.com、example2.com、example3.com)。

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

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

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

4

4 に答える 4

91

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

 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);
    }
 }
于 2010-07-30T16:02:40.367 に答える
27

私は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);
}

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

于 2010-08-03T14:38:14.620 に答える
11

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

ニス4のわずかな変更

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

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

backendをbackend_hintに置き換えます

于 2015-08-06T16:00:07.433 に答える
7

CristianVidmarと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";

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

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

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

次に、複数のサイトの共通要素のそれぞれに単一のキャッシュ(および非常に高いヒット率)を設定し、個々のwwwサイトの違いを維持できます。

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

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

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

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

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

于 2015-08-06T02:36:16.273 に答える