संपादित करें: मेरा उत्तर मूल मूल प्रश्न को कवर करता है, जो यह था कि क्या इस तरह की चीज लोड बैलेन्सर / रिवर्स प्रॉक्सी में विशिष्ट है। मुझे यकीन नहीं है कि इसके लिए nginx / product X का समर्थन है या नहीं, 99.9% मेरा रिवर्स प्रॉक्सिंग अनुभव HAproxy के साथ है।
सही बात। क्लाइंट की तरफ HTTP कीप-अलाइव, लेकिन सर्वर साइड पर नहीं।
क्यूं कर?
यदि आप कुछ विवरणों को तोड़ते हैं, तो आप जल्दी से देख सकते हैं कि यह एक लाभ क्यों है। इस उदाहरण के लिए, आइए दिखाते हैं कि हम एक पृष्ठ www.example.com लोड कर रहे हैं और उस पृष्ठ में 3 चित्र शामिल हैं, img [1-3 .jpg]।
कीप-अलाइव के बिना ब्राउजर एक पेज लोड करता है
- क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
- क्लाइंट "/" के लिए HTTP GET अनुरोध करता है
- सर्वर यूआरआई की HTML सामग्री "/" (जिसमें 3 छवियाँ संदर्भित HTML टैग शामिल हैं) भेजता है
- सर्वर TCP कनेक्शन को बंद कर देता है
- क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
- क्लाइंट "/img1.jpg" के लिए HTTP GET अनुरोध करता है
- सर्वर छवि भेजता है
- सर्वर TCP कनेक्शन को बंद कर देता है
- क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
- क्लाइंट "/img2.jpg" के लिए HTTP GET अनुरोध करता है
- सर्वर छवि भेजता है
- सर्वर TCP कनेक्शन को बंद कर देता है
- क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
- क्लाइंट "/img3.jpg" के लिए HTTP GET अनुरोध करता है
- सर्वर छवि भेजता है
- सर्वर TCP कनेक्शन को बंद कर देता है
ध्यान दें कि 4 अलग टीसीपी सत्र स्थापित हैं और फिर बंद हो गए हैं।
कीप-अलाइव के साथ ब्राउजर एक पेज लोड करता है
HTTP कीप-अलाइव एक ही टीसीपी कनेक्शन के लिए कई HTTP अनुरोधों की अनुमति देता है, एक के बाद एक।
- क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
- क्लाइंट "/" के लिए HTTP GET अनुरोध करता है, और सर्वर से इसे HTTP कीप-अलाइव सत्र बनाने के लिए भी कहता है।
- सर्वर यूआरआई की HTML सामग्री "/" (जिसमें 3 छवियाँ संदर्भित HTML टैग शामिल हैं) भेजता है
- सर्वर TCP कनेक्शन को बंद नहीं करता है
- क्लाइंट करता है और HTTP / "Gimg1.jpg" के लिए अनुरोध प्राप्त करता है
- सर्वर छवि भेजता है
- क्लाइंट करता है और HTTP / "Gimg2.jpg" के लिए अनुरोध प्राप्त करता है
- सर्वर छवि भेजता है
- क्लाइंट करता है और HTTP / "Gimg3.jpg" के लिए अनुरोध प्राप्त करता है
- सर्वर छवि भेजता है
- यदि HTTP HTTP Keep-Alive टाइमआउट अवधि में कोई और HTTP अनुरोध प्राप्त नहीं होता है तो सर्वर TCP कनेक्शन को बंद कर देता है
ध्यान रखें कि Keep-Alive के साथ, केवल 1 TCP कनेक्शन स्थापित है और अंततः बंद हो गया है।
क्यों बेहतर रहता है?
इसका उत्तर देने के लिए आपको समझना चाहिए कि क्लाइंट और सर्वर के बीच टीसीपी कनेक्शन स्थापित करने में क्या लगता है। इसे टीसीपी 3-वे हैंडशेक कहा जाता है।
- क्लाइंट एक SYN (chronise) पैकेट भेजता है
- सर्वर एक SYN (chronise) ACK (अबॉलेजमेंट), SYN-ACK वापस भेजता है
- ग्राहक एक ACK (अबॉलेजमेंट) पैकेट भेजता है
- टीसीपी कनेक्शन अब क्लाइंट और सर्वर दोनों द्वारा सक्रिय माना जाता है
नेटवर्क में विलंबता होती है, इसलिए 3-तरफ़ा हैंडशेक में प्रत्येक चरण में एक निश्चित समय लगता है। कहते हैं कि क्लाइंट और सर्वर के बीच 30ms है, टीसीपी कनेक्शन को स्थापित करने के लिए आवश्यक IP पैकेट के आगे-पीछे भेजने का मतलब है कि टीसीपी कनेक्शन स्थापित करने के लिए 3 x 30ms = 90ms लगते हैं।
यह बहुत अधिक नहीं लग सकता है, लेकिन अगर हम मानते हैं कि हमारे मूल उदाहरण में, हमें 4 अलग टीसीपी कनेक्शन स्थापित करने हैं, तो यह 360ms हो जाता है। क्या होगा यदि क्लाइंट और सर्वर के बीच विलंबता 30ms के बजाय 100ms है? फिर हमारे 4 कनेक्शन स्थापित करने के लिए 1200ms ले रहे हैं।
इससे भी बदतर, एक विशिष्ट वेब पेज को लोड करने के लिए केवल 3 छवियों से अधिक की आवश्यकता हो सकती है, इसमें कई सीएसएस, जावास्क्रिप्ट, छवि या अन्य फाइलें हो सकती हैं जो क्लाइंट को अनुरोध करने की आवश्यकता होती है। यदि पेज 30 अन्य फ़ाइलों को लोड करता है और क्लाइंट-सर्वर विलंबता 100ms है, तो हम टीसीपी कनेक्शन स्थापित करने में कितना समय लगाते हैं?
- 1 टीसीपी कनेक्शन स्थापित करने के लिए 3 x विलंबता अर्थात 3 x 100ms = 300ms लगते हैं।
- हमें यह 31 बार करना चाहिए, एक बार पृष्ठ के लिए, और पृष्ठ द्वारा संदर्भित एक दूसरे फ़ाइल के लिए 30 बार। 31 x 300ms = 9.3 सेकंड।
एक वेबपेज को लोड करने के लिए टीसीपी कनेक्शन स्थापित करने में 9.3 सेकंड का समय लगा जो 30 अन्य फाइलों को संदर्भित करता है। और वह भी HTTP अनुरोध भेजने और प्रतिक्रियाएं प्राप्त करने में बिताए गए समय की गणना नहीं करता है।
HTTP कीप-अलाइव के साथ, हमें केवल 1 TCP कनेक्शन स्थापित करने की आवश्यकता है, जिसमें 300ms लगते हैं।
अगर HTTP कीप-अलाइव इतना शानदार है, तो इसे सर्वर साइड पर भी क्यों न इस्तेमाल किया जाए?
HTTP रिवर्स प्रॉक्सीज़ (जैसे HAproxy) को आम तौर पर बैकेंड सर्वर के बहुत करीब तैनात किया जाता है, जिसके लिए वे प्रॉक्सी करते हैं। ज्यादातर मामलों में रिवर्स प्रॉक्सी और उसके बैकएंड सर्वर / एस के बीच विलंबता 1ms से कम होगी, इसलिए टीसीपी कनेक्शन स्थापित करना क्लाइंट के बीच की तुलना में बहुत तेज है।
हालांकि यह केवल आधा कारण है। एक HTTP सर्वर प्रत्येक क्लाइंट कनेक्शन के लिए एक निश्चित मात्रा में मेमोरी आवंटित करता है। कीप-अलाइव के साथ, यह कनेक्शन को जीवित रखेगा, और विस्तार से यह सर्वर पर उपयोग में एक निश्चित मात्रा में मेमोरी रखेगा, जब तक की-अलाइव टाइमआउट नहीं हो जाता है, जो कि सर्वर कॉन्फ़िगरेशन के आधार पर 15 तक हो सकता है ।
इसलिए यदि हम HTTP रिवर्स प्रॉक्सी के सर्वर साइड पर कीप-अलाइव का उपयोग करने के प्रभावों पर विचार करते हैं, तो हम मेमोरी की आवश्यकता को बढ़ा रहे हैं, लेकिन क्योंकि प्रॉक्सी और सर्वर के बीच विलंबता बहुत कम है, इसलिए हमें प्रॉक्सी से कोई वास्तविक लाभ नहीं मिलता है टीसीपी के 3-वे हैंडशेक के लिए समय में कमी, इसलिए आम तौर पर इस परिदृश्य में प्रॉक्सी और वेब सर्वर के बीच कीप-अलाइव को अक्षम करना बेहतर है।
अस्वीकरण: हाँ, यह स्पष्टीकरण इस तथ्य को ध्यान में नहीं रखता है कि ब्राउज़र आमतौर पर एक सर्वर में कई HTTP कनेक्शन समानांतर में स्थापित करते हैं। हालाँकि, एक सीमा होती है कि एक ब्राउज़र एक ही होस्ट को कितने समानांतर कनेक्शन देगा, और आमतौर पर यह अभी भी काफी छोटा है, जो कि रखने के लिए वांछनीय है।