2012-04-23 24 views
5

के बीच उपयोगकर्ता द्वारा जेनरेट किए गए सबडोमेन को रूट करना मैं एक वेब अनुप्रयोग को बनाए रखता हूं जो एक एकल वीपीएस को बढ़ा रहा है। आर्किटेक्चर में बड़ी संख्या में छोटे उपयोगकर्ता होते हैं, जिनमें से प्रत्येक अपने स्वयं के सबडोमेन के साथ होता है। उपयोगकर्ता बातचीत नहीं करते हैं। लोड का मतलब है कि मुझे कुछ उपयोगकर्ताओं और सभी नए उपयोगकर्ताओं को एक अलग सर्वर पर वेब एप्लिकेशन की दूसरी स्थापना में स्थानांतरित करना है।क्षैतिज स्केलिंग: सर्वर

वर्तमान में, प्रत्येक उपयोगकर्ता सबडोमेन एक ही वर्चुअलहोस्ट पर पड़ता है, जहां एक एकल PHP फ्रंट नियंत्रक मेजबाननाम के आधार पर उपयुक्त सामग्री प्रदर्शित करता है। * .mydomain.com के लिए एक एकल वाइल्डकार्ड DNS रिकॉर्ड वर्तमान सर्वर पर इंगित करता है।

अलग-अलग सर्वरों के लिए अलग-अलग उपयोगकर्ता सबडोमेन को रूट करने का मेरा सबसे अच्छा विकल्प क्या है?

मेरे विचार:

  • हर सर्वर के लिए एक नया शीर्ष स्तर के डोमेन। user.s1.mydomain.com, user.s2.mydomain.com और इतने पर (असजीला और लीक जानकारी)
  • सर्वर के बीच मार्ग उपयोगकर्ताओं के लिए अपने खुद के DNS सर्वर चलाएं (विफलता के अतिरिक्त अंक, अपरिचित प्रौद्योगिकी)
  • एक केंद्रीय फ्रंट कंट्रोलर/बैलेंसर जो उपयुक्त सर्वर (प्रत्येक विफलता का अतिरिक्त बिंदु, संभावित रूप से सीमित कनेक्शन) के लिए प्रत्येक अनुरोध को रिवर्स-प्रॉक्सी करता है
+1

क्या प्रत्येक सबडोमेन के लिए उपयोगकर्ता द्वारा जेनरेट की गई सामग्री डेटाबेस में है या क्या वे सर्वर पर फाइल सिस्टम पर अपना डेटा अपलोड करते हैं? – drew010

+0

@ drew010 उपयोगकर्ता सामग्री डेटाबेस और फाइल सिस्टम दोनों में संग्रहीत है। चूंकि उपयोगकर्ता इंटरैक्ट नहीं करते हैं, इसलिए मैं स्वतंत्र रूप से कई डेटाबेस इंस्टेंस सेट कर सकता हूं ... समस्या सिर्फ पृष्ठ क्वेरी को रूट कर रही है। मुझे लगता है कि अलग-अलग डीबी + वेब सर्वर स्केलिंग का एक और संभावित तरीका होगा, लेकिन अंत में मुझे वेब सर्वर को विभाजित करना होगा और समाधान की आवश्यकता होगी – mappu

+1

यही वह था जो मैं ढूंढ रहा था। मैं सबसे अधिक DNS की तरफ झुका रहा हूं लेकिन इसका मतलब है कि आपको प्रत्येक सबडोमेन, या एक कस्टम DNS समाधान के लिए एक रिकॉर्ड की आवश्यकता होगी जो आपके एप्लिकेशन से यह पूछने के लिए पूछ सके कि दिए गए सबडोमेन के लिए कौन सा आईपी पता उपयोग करना है।सर्वरफॉल्ट पर अब आपसे बेहतर परिणाम हो सकते हैं कि मैं इसके बारे में सोचता हूं। – drew010

उत्तर

4

उस बिंदु पर आवेदन के स्केलिंग-आउट में, मैं एक केंद्रीय के साथ जाऊंगा फ्रंट लोड बैलेंसर। Nginx को किसी एक लोड द्वारा गतिशील रूप से सेवा की जा रही किसी भी लोड को संभालना चाहिए। हमारे पास छह गतिशील सर्वर और एक स्थिर सामग्री सर्वर के लिए फ्रंट एंड के रूप में nginx है, और nginx पर दृष्टि में कोई बाधा नहीं है।

अपने स्केल-पॉइंट पर, सभी स्थैतिक सामग्री को स्वयं संभालने के लिए nginx सेटअप करें, और प्रॉक्सी गतिशील सामग्री को आवश्यकतानुसार कई बॉक्स में रिवर्स करें। स्थैतिक सामग्री की सेवा और जैसे सभी बाकी है, कुछ वापस गुजर के लिए

upstream upstream_regular_backend { 
    fair; 
    server 10.0.0.1:80; 
    server 10.0.0.2:80; 
} 

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    location/{ 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

:

server { 
    listen 0.0.0.0:80; 
    server_name example.com; 
    proxy_set_header Host $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    index index.php; 
    root /some/dir/: 
    location ~ \.php { 
     proxy_pass http://upstream_regular_backend; 
    } 
} 

स्वाभाविक रूप से, अगर आप PHP का उपयोग नहीं कर रहे हैं, विन्यास tweak सरल प्रॉक्सी पारित करने के लिए सेटअप के करीब है तदनुसार।

अपस्ट्रीम परिभाषा पर, "निष्पक्ष;" प्रतिक्रिया-समय के आधार पर लोड-बैलेंस बैकएंड्स होगा। कैशिंग उद्देश्यों के लिए, आप "ip_hash;" का उपयोग करना चाह सकते हैं इसके बजाए, क्योंकि यह हमेशा एक ही सर्वर पर ग्राहक से अनुरोध करेगा।

हमारा सेटअप सड़क के नीचे थोड़ा और आगे है। हमारे पास nginx load-balancers एक वार्निश कैश प्रॉक्सी कर रहे हैं, जो बदले में गतिशील सामग्री सर्वर प्रॉक्सी करता है।

यदि आप एक सिंगल पॉइंट ऑफ असफलता के बारे में चिंतित हैं, तो फ्रंटड के आईपी को विफल होने के मामले में एक द्वितीयक सर्वर तैयार करने के लिए तैयार करें।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद - ऐसा लगता है कि जब तक nginx खुले कनेक्शन को छोड़ सकता है, और ip_hash (लापता पहेली टुकड़ा) मुझे एप्लिकेशन को पुनर्व्यवस्थित करने से बचाता है, इस पर ध्यान नहीं दिया जाता कि प्रत्येक सर्वर किस सर्वर पर आता है। क्या आपके पास nginx लोड बैलेंसर एसएसएल समाप्त है? – mappu

+0

हम SSL को nginx पर समाप्त करते हैं, हालांकि मैंने वर्णित सेटअप पर नहीं। –

+0

कनेक्शन सीमाओं के संबंध में, मुझे जो याद है, उसमें से केवल एक ही सीमा खुली फ़ाइल वर्णनकर्ताओं की संख्या थी। Nginx init.d को संशोधित करें और इसे जितना आवश्यक हो उतना उलझाना चाहिए। इसके अलावा, nginx रूटिंग यातायात में उत्कृष्ट दक्षता है। –