Soru Vernikli birden fazla siteyi yapılandır


Vernik gibi birden fazla alana hizmet vermesi gereken bir sunucumuz var. example1.com, example2.com ve example3.com

Güncel .vcl dosyamız şu şekildedir:

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

Doğru gelen istek için doğru req.http.Host'u nasıl ayarlayabilirim?


44
2017-07-26 10:35


Menşei




Cevaplar:


Birden çok önalan etki alanını bu şekilde destekleyebilirsiniz:

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

81
2017-07-30 16:02



Bu ayrıca www.backend1.com ve backend1.com ile eşleşecek mi? - Tom
eğer varsa return (lookup)Varnish istekleri almak için herhangi bir gönderi talebini gizleyeceğinden, gönderiler çalışmayabilir. Bu kodu kaldır ve işe yarayacak. - AddersUK
Bu fantastik. Senin ve msurovcak'ın cevabının bir kombinasyonunu kullandım, ama bu çok yardımcı oldu. Güzel - Josh Davenport
Standart olmayan bir bağlantı noktasında dinliyorsanız (belki de test ederken), port numarası testte yer almalıdır. if (req.http.host == "example.com:8080") { - Leif Neland
Vernik 4'te req.backend oldu adını için req.backend_hint. - Quinn Comendant


Cristian'ınkine benzer bir kurulum yapıyorum ama eğer cümlelerde req.http.host'u düzenli ifadeyle karşılaştırıyorum:

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

Arka planları uygun şekilde ayarlamayı unutmayın!


24
2017-08-03 14:38



Çok ilginç teşekkürler! - Tom
Bunu ekleyebilirim return (lookup); gereksizdir - vernik varsayılan olarak bunu yapar - yitwail
Ayrıca, arka uç için alan adı yerine fiziksel ip kullanabilirsiniz. backend ipaddr1 {.host = "xxx.xxx.xxx.xxx"; - yitwail
IMHO, bu cevabı düzenlemeli ve tamamlamalısınız (diğer bir deyişle, arka planlar ekleyin vb.). - Tiago Franco
Harika yanıt, arama kullanılmamalıdır, çünkü karmaşık yapılandırmalarda alt vcl_recv içinde devam eden bir sürü şey var. - Dario Fumagalli


Yorum ekleyemiyoruz, işte burada gidiyoruz

vernik 4 için hafif değişiklik

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

değiştirmek     arka uç ile     backend_hint


6
2017-08-06 16:00



vcl_recv şimdi geri dönmeli hash yerine lookup - kalelc


Cristian Vidmar ve msurovcak'ın yayınlarına biraz daha ayrıntı eklemek istiyorum.

"(Req.http.host ==" example1.com ")" Desen:

Sunucu başına yüzlerce siteye ev sahipliği yapmak için açıklanan deseni kullandık.

Tüm yapılandırmanız boyunca (vcl_fetch / vcl_backend_response, vcl_hash vb.) Site özel kurallarına devam edebilirsiniz.

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

Örnek gereken her yerde.

Müşteriye özel konfigürasyonların, kendi mantığını içeren tek tek dosyalar aracılığıyla yönetilmesini sağlamak için şablon kodlama motoruyla birleştirin (tümü kodları izole etmek için bloklar varsa, sitelerine özel olarak sarılır).

Her bir site bloğunu aşağıdakileri kullanarak default.vcl dosyasına dahil edersiniz:

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

Arka tarafları tamamen ayırmak için isteğe bağlı bir geliştirme:

Tamamen farklı web sitelerine ev sahipliği yapıyorsanız, backends (ve bölünmüş önbellek) bölmek, gitmek için iyi bir yoldur.

Siteler benzerse (aynı codebase / js / css / images), örneğin bir kaynak etki alanını çalıştırmak ilginç olabilir. tüm sitelerin kullandığı resources.example.com.

Birden çok sitenin ortak öğelerinin her birinde tek bir önbelleğe (ve çok yüksek isabet oranına) sahip olabilirsiniz ve ayrı ayrı www sitelerinde farklılıkları koruyabilirsiniz.

Bölünmüş arka uçları kullanmanın bir başka alternatifi:

Başka bir seçenek, Vernik örneklerini konteynerler ile ayırmaktır. Her biri daha sonra bireysel olarak yönetilen (ve yaşar ve ölür) kendi izole dünyası haline gelir. Bu iyi bir güvenlik seçeneği olabilir ve modern altyapıda çoklu işlemlerin yükü asgari düzeydedir.

Bunun bazı avantajları, daha sonra varyasyonun farklı versiyonlarını ve örnek başına farklı Vernik başlangıç ​​parametrelerini desteklemenizdir.

Bu, bireysel kayıt için, örnek başına farklı ESI modlarından ve bireysel bellek / ayarlama yapılandırma ayarlarından yararlanarak mükemmel olabilir.

Bunu biz yapıyoruz www.section.io Ayrıca coğrafi olarak dağınık kullanıcı tabanlarına olabildiğince yakınlaşmak için farklı coğrafi konumlarda veya farklı konumlarda aynı kaplarda farklı kapların çalıştırılmasına da olanak sağlıyor.


4
2017-08-06 02:36