सवाल वार्निश के साथ कई साइटों को कॉन्फ़िगर करें


हमारे पास एक सर्वर है जो कई डोमेनों की सेवा करने की आवश्यकता है हालांकि वार्निश उदा। example1.com, example2.com और example3.com

हमारी वर्तमान .vcl फ़ाइल इस तरह दिखती है:

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

मैं सही आने वाले अनुरोध के लिए सही req.http.Host कैसे सेट करूं?


44
2017-07-26 10:35


मूल




जवाब:


आप इस तरह से कई फ्रंटेंड डोमेन का समर्थन कर सकते हैं:

 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



क्या यह www.backend1.com और backend1.com से भी मेल खाता है? - Tom
यदि आपके पास है return (lookup), पोस्ट काम नहीं कर सकते क्योंकि वार्निश अनुरोध प्राप्त करने के लिए किसी भी पोस्ट अनुरोध को गुप्त करेगा। इस कोड को हटा दें और यह काम करेगा। - AddersUK
यह शानदार है। आपके और msurovcak के जवाब का एक संयोजन इस्तेमाल किया, लेकिन यह बहुत उपयोगी था। अच्छा है - Josh Davenport
यदि आप गैर मानक पोर्ट (शायद परीक्षण करते समय) पर सुन रहे हैं, तो पोर्ट-नंबर को परीक्षण में निहित होना चाहिए। अगर (req.http.host == "example.com:8080") { - Leif Neland
वार्निश 4 में, req.backend था नाम बदला सेवा मेरे req.backend_hint। - Quinn Comendant


मैं क्रिस्टियन के समान सेटअप का उपयोग कर रहा हूं, लेकिन यदि खंड में मैं नियमित अभिव्यक्ति के खिलाफ 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);
}

बैकएंड उचित रूप से सेट करना न भूलें!


24
2017-08-03 14:38



बहुत दिलचस्प धन्यवाद! - Tom
मैं इसे जोड़ सकता हूँ return (lookup); अनावश्यक है - वार्निश डिफ़ॉल्ट रूप से करता है - yitwail
साथ ही, आप बैकएंड के लिए डोमेन नाम के बजाय भौतिक आईपी का उपयोग कर सकते हैं, जैसे backend ipaddr1 {.host = "xxx.xxx.xxx.xxx"; - yitwail
आईएमएचओ, आपको इस उत्तर को संपादित करना चाहिए और इसे पूरा करना चाहिए (यानी बैकएंड भी जोड़ें, आदि)। - Tiago Franco
बहुत बढ़िया उत्तर, लुकअप का उपयोग नहीं किया जाना चाहिए, क्योंकि जटिल विन्यास में आपके पास उप vcl_recv में कई अन्य सामान चल रहे हैं - Dario Fumagalli


टिप्पणी जोड़ने में असमर्थ तो हम यहां जाते हैं

वार्निश 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


6
2017-08-06 16:00



vcl_recv अब वापस आना चाहिए hash के बजाय lookup - kalelc


मैं क्रिस्टियन विद्वार और msurovcak दोनों पदों के लिए थोड़ा और विस्तार जोड़ना चाहता हूं

"(Req.http.host ==" example1.com ")" पैटर्न:

हमने प्रति सर्वर सैकड़ों साइटों पर दसियों की मेजबानी करने के लिए वर्णित पैटर्न का उपयोग किया है।

आप अपनी संपूर्ण कॉन्फ़िगरेशन (vcl_fetch / vcl_backend_response, vcl_hash आदि) का उपयोग करके साइट विशिष्ट कस्टम नियमों के साथ जारी रख सकते हैं

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

उदाहरण जहां भी जरूरत है।

इसे एक टेम्पलेटिंग इंजन के साथ संयोजित करने के लिए ग्राहक विशिष्ट कॉन्फ़िगरेशन को व्यक्तिगत फाइलों के माध्यम से प्रबंधित करने की अनुमति देने के लिए संयोजित करें जिसमें उनके स्वयं के तर्क शामिल हैं (सभी कोड को अलग करने के लिए ब्लॉक अगर उनकी साइट के साथ लिपटे हैं)।

फिर आप प्रत्येक व्यक्तिगत साइट ब्लॉक को डिफ़ॉल्ट.vcl में उपयोग करके शामिल करते हैं:

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

पूरी तरह से विभाजित बैकएंड के लिए एक वैकल्पिक वृद्धि:

यदि आप पूरी तरह से अलग वेबसाइटों की मेजबानी कर रहे हैं तो बैकएंड्स (और विभाजित कैश) को विभाजित करना एक अच्छा तरीका है।

यदि साइटें समान हैं (समान कोडबेस / जेएस / सीएसएस / छवियां) संसाधन संसाधन चलाने के लिए दिलचस्प हो सकती है उदाहरण के लिए। resource.example.com कि सभी साइटें उपयोग करती हैं।

इसके बाद आप एकाधिक साइटों के प्रत्येक सामान्य तत्वों में एक एकल कैश (और बहुत अधिक हिट दर) प्राप्त कर सकते हैं और फिर भी व्यक्तिगत www साइटों पर अंतर बनाए रख सकते हैं।

विभाजित बैक सिरों का उपयोग करने का एक और विकल्प:

एक और विकल्प कंटेनरों के माध्यम से वार्निश उदाहरणों को विभाजित करना है। प्रत्येक तब यह अलग-अलग दुनिया बन जाता है जिसे व्यक्तिगत रूप से प्रबंधित किया जाता है (और रहता है और मर जाता है)। यह एक अच्छा सुरक्षा विकल्प हो सकता है और कई बुनियादी प्रक्रियाओं का ओवरहेड आधुनिक आधारभूत संरचना पर न्यूनतम है।

इसके कुछ फायदे यह है कि आप प्रति संस्करण के विभिन्न संस्करणों और प्रति उदाहरण के विभिन्न वार्निश स्टार्टअप पैरामीटर का समर्थन कर सकते हैं।

व्यक्तिगत लॉगिंग के लिए यह बहुत अच्छा हो सकता है, प्रति उदाहरण अलग-अलग ईएसआई मोड और व्यक्तिगत मेमोरी / ट्यूनिंग कॉन्फ़िगरेशन सेटिंग्स का लाभ उठा सकता है।

हम इसे करते हैं www.section.io और यह भौगोलिक दृष्टि से फैले हुए उपयोगकर्ता अड्डों के लिए जितना संभव हो सके उतने करीब पहुंचने के लिए विभिन्न भौगोलिक स्थानों या अलग-अलग स्थानों में एक ही कंटेनर में विभिन्न कंटेनर चलाने की क्षमता देता है।


4
2017-08-06 02:36