0

実際、私のセットアップはこんな感じです。

cluster.com - 192.168.0.200 (varnish/port 80)
example.com - 192.168.0.100  (apache,namebased vhost/8080 - backendname - website)
yyy.com - 192.168.0.100  (apache,namebased vhost/8080 -backendname - api)

cluster.com is the varnish server and front-end connections coming to this and rewrite to other defined back-ends (round-robin based balancing)

    backend website     {
    .host = "example.com";
    .port = "8080";

         }
    backend api     {
       .host = "yyy.com";
        .port = "8080";

      }

     director clust round-robin     {
          { .backend = api;  }
          { .backend = website;  }

          }

        sub vcl_recv    {
        set req.backend = clust;
        if (req.request)
         {
         return(pass);
         }

         }


when i hit the cluster.com , it is always going to example.com, but what i need to do is first request go to example.com second request yyy.com and so on...when i add another server (different host/different IP say 192.168.0.111/zzz.com, and a different backend) , it goes like this

first request - example.com
second request - examplee.com
third request - zzz.com


but i can change the default behavior by setting up set req.host = yyy.com and then it will      goes to
first request - yyy.com
  second request - yyy.com
   third request - zzz.com

これは、正しいバックエンドへのホスト ヘッダー転送と関係があります。その機能を vcl_recv に追加するにはどうすればよいですか? これについての助けに感謝します。これは他のサーバーで完全に機能しています(名前ベースの仮想ホストではなく、異なるサーバー)

4

1 に答える 1

1

ニスのバックエンド選択ではホスト ヘッダーは使用されないため、ホスト ヘッダーについて心配する必要はありません。

したがって、バックエンド宣言のみが必要です192.168.0.100:8080(Apache が名前付き仮想ホストを処理するため)。: リクエストのホスト ヘッダーには、定義済みの Apache が含まれている必要があります。ServerName/ServerAlias

したがって、192.168.0.111 が example.com と yyy.com の両方を解決できるが、192.168.0.100 が zzz.com を解決できない場合、バックエンドの選択のみを処理する必要があります。

# As both your defined backends resolve to the same IP and port,
#you only need to define ONE backend instead of two
backend website_and_api {
  # Which resolves both example.com and yyy.com
  .host = "192.168.0.100";
  .port = "8080";
}
# The server you add later on
backend third {
  # Which resolves all example.com, yyy.com and zzz.com
  .host = "192.168.0.111";
  .port = "8080";
}

director clust round-robin {
  #Backends that resolve both example.com and yyy.com
  { .backend = website_and_api; }
  { .backend = third; }
}

sub vcl_rec {
  # Set the default backend, I'll choose two since it resolves most domains
  set req.backend = third;
  # Choose clust if the domain is appropiate
  if ( req.http.host ~ "example.com"
    || req.http.host ~ "yyy.com") {
    set req.backend = clust;
  }
  # Any return must be done below here
  # ...
}

PS: VCL を編集して拡張し、少し明確にしようとしています

これは、次の場合に正常に機能します。

  1. クライアントはリクエストで正しい Host ヘッダーを渡します (example.com|yyy.com|zzz.com)
  2. サーバー 192.168.0.100 は、名前付き仮想ホスティングを処理するように正しく設定されています。
    • Apache は example.com:8080 を解決します
    • Apache は yyy.com:8080 を解決します
    • Apache は 192.168.0.100:8080 の賢明なデフォルトを提供します
  3. サーバー 192.168.0.111 は、名前付き仮想ホスティングを処理するように正しく設定されています。
    • Apache は example.com:8080 を解決します
    • Apache は yyy.com:8080 を解決します
    • Apache は zzz.com:8080 を解決します
    • Apache は 192.168.0.100:8080 の賢明なデフォルトを提供します
  4. あなたの VCL コードは、受信した Host ヘッダーを台無しにしません (別のものに設定しないでください)。
于 2013-08-30T13:56:50.030 に答える