कल्पना करें कि हमारे पास एक एप्लिकेशन / वेबसाइट है जो काफी उच्च भार के साथ है।
VK या Odnoklassniki के लिए कई एप्लिकेशन डेवलपर्स ने ऐसी स्थिति का सामना किया है जहां एप्लिकेशन नए अनुप्रयोगों के शीर्ष पर जाता है और आप पर बहुत बड़ा भार पड़ता है।
मान लीजिए, क्लाइंट की किसी सर्वर तक पहुँचने की प्रक्रिया में, एक चित्र उत्पन्न होता है। हमारे पास बहुत सारे सर्वर हैं। अगर आपके पास एक भी फाइल सिस्टम नहीं है और सर्वर के बीच फाइल सिंक्रोनाइज़ नहीं हैं, तो क्लाइंट यह तस्वीर कैसे दे सकता है?
जब सर्वर पर हर सेकंड बड़ी संख्या में लोग आते हैं तो क्या करें? इसका उत्तर सरल है - नग्नेक्स।
इस विषय में, मैं स्टैटिक फाइल और डायनेमिक फाइल दोनों को संतुलित करने पर विचार करूंगा।
मैं तुरंत आरक्षण कर दूंगा। हम MySQL में प्रश्नों को संतुलित करने के विकल्पों पर चर्चा नहीं करेंगे।
अर्थात मोटे तौर पर, हमारे पास ऐसे सर्वर हैं जिन पर php स्क्रिप्ट्स का एक ही सेट स्थापित है, php-fpm स्थापित और कॉन्फ़िगर किया गया है। दोनों सर्वर क्लाइंट अनुरोधों का जवाब देते हैं और रिकॉर्ड DNS कॉन्फ़िगरेशन में दर्ज किए जाते हैं, जिसके अनुसार आपका डोमेन 173.194.32.2 और 173.194.32.3 पर जवाब देता है।
तो चलिए चलते हैं।
सर्वर सेटिंग्स
सर्वर 1:
बाहरी आईपी पता: 173.194.32.2
आंतरिक आईपी पता: 192.168.0.1
सर्वर 2:
बाहरी आईपी पता: 173.194.32.3
आंतरिक आईपी पता: 192.168.0.2
हमारा नेटवर्क आरेख कुछ इस तरह दिखेगा:

Nginx कॉन्फ़िगरेशन। सर्वर 1:
upstream nextserver { server 192.168.0.2; } upstream backend { server 127.0.0.1; } server { listen *:80; server_name 173.194.32.2; location / { root /var/www/default; # . access_log off; try_files $uri $uri/ @nextserver; } location @nextserver { proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; } location ~* \.(php5|php|phtml)$ { proxy_pass http://backend; } }
आइए इस कॉन्फ़िगरेशन को अधिक विस्तार से देखें।
सबसे पहले, हम उन सर्वरों को परिभाषित करते हैं जिन पर हम ग्राहकों को वितरित करेंगे।
अपस्ट्रीम नेक्ससर्वर
nextserver - स्थिर फ़ाइलों को अपलोड करने के लिए सर्वरों की सूची
server 192.168.0.2;
अपस्ट्रीम बैकएंड
बैकएंड - गतिशील सामग्री वितरित करने के लिए सर्वर की एक सूची (उदा। php)
server 127.0.0.1;
वैसे, यदि आपको निश्चित रूप से हर बार क्लाइंट से उसी सर्वर पर अनुरोध प्राप्त करने की आवश्यकता है, तो अपस्ट्रीम सेक्शन में ip_hash निर्देश जोड़ें;
स्थान /
मानक निर्देश। सर्वर का रूट डायरेक्टरी रूट डायरेक्टिव द्वारा सेट किया गया है
root /var/www/default;
Access_log को अक्षम करें। भारी भार के साथ, प्रवेश लॉग प्रविष्टि, पहले स्थान पर, डिस्क पर अतिरिक्त भार प्रदान करेगा, और दूसरे में, यह जल्दी से डिस्क को रोक देगा।
access_log off;
सबसे दिलचस्प बात इस लाइन पर होती है :) हम फ़ाइल के अस्तित्व की जांच करते हैं, फिर निर्देशिका के अस्तित्व की। यदि फ़ाइल मौजूद है, तो nginx क्लाइंट को देता है। यदि फ़ाइल / निर्देशिका मौजूद नहीं है, तो क्लाइंट को @nextserver स्थान पर पुनर्निर्देशित किया जाता है।
try_files $uri $uri/ @nextserver;
स्थान @nextserver
यहां सब कुछ सरल है। क्लाइंट को इस स्थान पर पुनर्निर्देशित करते समय, हम क्लाइंट अनुरोध को प्रॉक्सी_पास निर्देश के माध्यम से अपस्ट्रीम नेक्स्टसर्वर पर पुनर्निर्देशित करते हैं। इस मामले में, यह 192.168.0.2 है। अपस्ट्रीम सेक्शन में एक से अधिक सर्वर हो सकते हैं, इसलिए यदि हम चाहें तो क्लाइंट्स को कई सर्वरों पर रीडायरेक्ट कर सकते हैं।
यदि दो सर्वर हैं, तो पहला क्लाइंट पहले सर्वर पर जाएगा, और दूसरा क्लाइंट दूसरे में।
इसके अलावा, इस खंड में पुनर्निर्देशन सेटिंग्स निर्धारित हैं। इस मामले में, टाइमआउट।
proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90;
स्थान ~ * \। (php5 | php | phtml) $
एक्सटेंशन php5, php, phtml वाली फ़ाइलों का अनुरोध करते समय - हम क्लाइंट को हैंडलर पर पुनर्निर्देशित करते हैं - इस मामले में, अपस्ट्रीम बैकएंड
proxy_pass http://backend;
केवल एक चीज बाकी है जो दूसरे सर्वर सेक्शन को रजिस्टर करती है, इस बार सर्वर को 127.0.0.1 एड्रेस को सुनना चाहिए।
इस पते पर हमें कनेक्शन प्राप्त करने होंगे और उन्हें php-fpm का उपयोग करके काम करना होगा।
सर्वर अनुभाग एक विवरण के अपवाद के साथ ऊपर वर्णित छवि और समानता में लिखा गया है। हम स्थान को बदलते हैं ~ * \ (Php5 | php | phtml) $ अनुभाग निम्न में से।
location ~* \.(php5|php|phtml)$ { fastcgi_pass unix:/tmp/php-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/default$fastcgi_script_name; include fastcgi_params; }
इस खंड का वर्णन मानता है कि आपने php-fpm डेमॉन को संस्थापित और चलाया है और इसे /tmp/php-fpm.sock पर यूनिक्स सॉकेट सुनता है
हम पहले के साथ सादृश्य द्वारा दूसरे सर्वर को कॉन्फ़िगर करते हैं। हम अपस्ट्रीम नेक्ससर्वर सेक्शन में पता बदलकर 192.168.0.1 करते हैं (अर्थात, हम सर्वर को बताते हैं कि गैर-मौजूद फ़ाइलों के लिए अनुरोधों को सर्वर 1 पर भेजना आवश्यक है)।
इसके अलावा, हम server_name निर्देश बदलते हैं।
सर्वर 2 कॉन्फ़िगरेशन कुछ इस तरह दिखना चाहिए:
upstream nextserver { server 192.168.0.1; } upstream backend { server 127.0.0.1; } server { listen *:80; server_name 173.194.32.3; location / { root /var/www/default; # . access_log off; try_files $uri $uri/ @nextserver; } location @nextserver { proxy_pass http://nextserver; proxy_connect_timeout 70; proxy_send_timeout 90; proxy_read_timeout 90; } location ~* \.(php5|php|phtml)$ { proxy_pass http://backend; } }
इस प्रकार, यदि कोई क्लाइंट एक सर्वर पर मौजूद तस्वीर का अनुरोध करता है, तो दूसरे सर्वर पर चित्र की खोज करने का प्रयास किया जाएगा।
इस मामले में एकमात्र समस्या यह है कि यदि दोनों सर्वरों पर कोई चित्र नहीं हैं, तो अनुरोध एक सर्कल में एक सर्वर से दूसरे सर्वर तक प्रेषित किए जाएंगे जब तक कि यह समय समाप्त न हो जाए। परिणामस्वरूप, 503 त्रुटि वापस आ जाएगी।
इस लेख में निर्दिष्ट नग्नेक्स कॉन्फ़िगरेशन सरल है और इसमें सुधार किया जा सकता है, जिसमें अनुरोधित फ़ाइल की अनुपस्थिति में लूप के साथ समस्याओं को हल किया जा सकता है। लेकिन यह एक अलग मुद्दा है।