क्या HTTP रिवर्स प्रॉक्सीज़ आम तौर पर प्रॉक्सी कनेक्शन के क्लाइंट पक्ष पर HTTP कीप-अलाइव को सक्षम करते हैं और सर्वर साइड पर नहीं?


30

HAProxy में क्लाइंट साइड (क्लाइंट <-> HAProxy) पर HTTP रखने-सक्षम करने की क्षमता है, लेकिन इसे सर्वर साइड (HAProxy <-> सर्वर) पर अक्षम करें।

हमारे कुछ ग्राहक उपग्रह के माध्यम से हमारी वेब सेवा से जुड़ते हैं, इसलिए विलंबता ~ 600ms है और मुझे लगता है कि रख-रखाव को सक्षम करके, यह चीजों को थोड़ा गति देगा। क्या मैं सही हू?

क्या यह नगनेक्स द्वारा समर्थित है? क्या यह अन्य सॉफ़्टवेयर और हार्डवेयर लोड बैलेन्सर में व्यापक रूप से लागू किया गया फ़ीचर है? HAProxy के अलावा और क्या है?

जवाबों:


43

संपादित करें: मेरा उत्तर मूल मूल प्रश्न को कवर करता है, जो यह था कि क्या इस तरह की चीज लोड बैलेन्सर / रिवर्स प्रॉक्सी में विशिष्ट है। मुझे यकीन नहीं है कि इसके लिए nginx / product X का समर्थन है या नहीं, 99.9% मेरा रिवर्स प्रॉक्सिंग अनुभव HAproxy के साथ है।

सही बात। क्लाइंट की तरफ HTTP कीप-अलाइव, लेकिन सर्वर साइड पर नहीं।

क्यूं कर?

यदि आप कुछ विवरणों को तोड़ते हैं, तो आप जल्दी से देख सकते हैं कि यह एक लाभ क्यों है। इस उदाहरण के लिए, आइए दिखाते हैं कि हम एक पृष्ठ www.example.com लोड कर रहे हैं और उस पृष्ठ में 3 चित्र शामिल हैं, img [1-3 .jpg]।

कीप-अलाइव के बिना ब्राउजर एक पेज लोड करता है

  1. क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
  2. क्लाइंट "/" के लिए HTTP GET अनुरोध करता है
  3. सर्वर यूआरआई की HTML सामग्री "/" (जिसमें 3 छवियाँ संदर्भित HTML टैग शामिल हैं) भेजता है
  4. सर्वर TCP कनेक्शन को बंद कर देता है
  5. क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
  6. क्लाइंट "/img1.jpg" के लिए HTTP GET अनुरोध करता है
  7. सर्वर छवि भेजता है
  8. सर्वर TCP कनेक्शन को बंद कर देता है
  9. क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
  10. क्लाइंट "/img2.jpg" के लिए HTTP GET अनुरोध करता है
  11. सर्वर छवि भेजता है
  12. सर्वर TCP कनेक्शन को बंद कर देता है
  13. क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
  14. क्लाइंट "/img3.jpg" के लिए HTTP GET अनुरोध करता है
  15. सर्वर छवि भेजता है
  16. सर्वर TCP कनेक्शन को बंद कर देता है

ध्यान दें कि 4 अलग टीसीपी सत्र स्थापित हैं और फिर बंद हो गए हैं।

कीप-अलाइव के साथ ब्राउजर एक पेज लोड करता है

HTTP कीप-अलाइव एक ही टीसीपी कनेक्शन के लिए कई HTTP अनुरोधों की अनुमति देता है, एक के बाद एक।

  1. क्लाइंट पोर्ट 80 पर www.example.com पर एक टीसीपी कनेक्शन स्थापित करता है
  2. क्लाइंट "/" के लिए HTTP GET अनुरोध करता है, और सर्वर से इसे HTTP कीप-अलाइव सत्र बनाने के लिए भी कहता है।
  3. सर्वर यूआरआई की HTML सामग्री "/" (जिसमें 3 छवियाँ संदर्भित HTML टैग शामिल हैं) भेजता है
  4. सर्वर TCP कनेक्शन को बंद नहीं करता है
  5. क्लाइंट करता है और HTTP / "Gimg1.jpg" के लिए अनुरोध प्राप्त करता है
  6. सर्वर छवि भेजता है
  7. क्लाइंट करता है और HTTP / "Gimg2.jpg" के लिए अनुरोध प्राप्त करता है
  8. सर्वर छवि भेजता है
  9. क्लाइंट करता है और HTTP / "Gimg3.jpg" के लिए अनुरोध प्राप्त करता है
  10. सर्वर छवि भेजता है
  11. यदि HTTP HTTP Keep-Alive टाइमआउट अवधि में कोई और HTTP अनुरोध प्राप्त नहीं होता है तो सर्वर TCP कनेक्शन को बंद कर देता है

ध्यान रखें कि Keep-Alive के साथ, केवल 1 TCP कनेक्शन स्थापित है और अंततः बंद हो गया है।

क्यों बेहतर रहता है?

इसका उत्तर देने के लिए आपको समझना चाहिए कि क्लाइंट और सर्वर के बीच टीसीपी कनेक्शन स्थापित करने में क्या लगता है। इसे टीसीपी 3-वे हैंडशेक कहा जाता है।

  1. क्लाइंट एक SYN (chronise) पैकेट भेजता है
  2. सर्वर एक SYN (chronise) ACK (अबॉलेजमेंट), SYN-ACK वापस भेजता है
  3. ग्राहक एक ACK (अबॉलेजमेंट) पैकेट भेजता है
  4. टीसीपी कनेक्शन अब क्लाइंट और सर्वर दोनों द्वारा सक्रिय माना जाता है

नेटवर्क में विलंबता होती है, इसलिए 3-तरफ़ा हैंडशेक में प्रत्येक चरण में एक निश्चित समय लगता है। कहते हैं कि क्लाइंट और सर्वर के बीच 30ms है, टीसीपी कनेक्शन को स्थापित करने के लिए आवश्यक IP पैकेट के आगे-पीछे भेजने का मतलब है कि टीसीपी कनेक्शन स्थापित करने के लिए 3 x 30ms = 90ms लगते हैं।

यह बहुत अधिक नहीं लग सकता है, लेकिन अगर हम मानते हैं कि हमारे मूल उदाहरण में, हमें 4 अलग टीसीपी कनेक्शन स्थापित करने हैं, तो यह 360ms हो जाता है। क्या होगा यदि क्लाइंट और सर्वर के बीच विलंबता 30ms के बजाय 100ms है? फिर हमारे 4 कनेक्शन स्थापित करने के लिए 1200ms ले रहे हैं।

इससे भी बदतर, एक विशिष्ट वेब पेज को लोड करने के लिए केवल 3 छवियों से अधिक की आवश्यकता हो सकती है, इसमें कई सीएसएस, जावास्क्रिप्ट, छवि या अन्य फाइलें हो सकती हैं जो क्लाइंट को अनुरोध करने की आवश्यकता होती है। यदि पेज 30 अन्य फ़ाइलों को लोड करता है और क्लाइंट-सर्वर विलंबता 100ms है, तो हम टीसीपी कनेक्शन स्थापित करने में कितना समय लगाते हैं?

  1. 1 टीसीपी कनेक्शन स्थापित करने के लिए 3 x विलंबता अर्थात 3 x 100ms = 300ms लगते हैं।
  2. हमें यह 31 बार करना चाहिए, एक बार पृष्ठ के लिए, और पृष्ठ द्वारा संदर्भित एक दूसरे फ़ाइल के लिए 30 बार। 31 x 300ms = 9.3 सेकंड।

एक वेबपेज को लोड करने के लिए टीसीपी कनेक्शन स्थापित करने में 9.3 सेकंड का समय लगा जो 30 अन्य फाइलों को संदर्भित करता है। और वह भी HTTP अनुरोध भेजने और प्रतिक्रियाएं प्राप्त करने में बिताए गए समय की गणना नहीं करता है।

HTTP कीप-अलाइव के साथ, हमें केवल 1 TCP कनेक्शन स्थापित करने की आवश्यकता है, जिसमें 300ms लगते हैं।

अगर HTTP कीप-अलाइव इतना शानदार है, तो इसे सर्वर साइड पर भी क्यों न इस्तेमाल किया जाए?

HTTP रिवर्स प्रॉक्सीज़ (जैसे HAproxy) को आम तौर पर बैकेंड सर्वर के बहुत करीब तैनात किया जाता है, जिसके लिए वे प्रॉक्सी करते हैं। ज्यादातर मामलों में रिवर्स प्रॉक्सी और उसके बैकएंड सर्वर / एस के बीच विलंबता 1ms से कम होगी, इसलिए टीसीपी कनेक्शन स्थापित करना क्लाइंट के बीच की तुलना में बहुत तेज है।

हालांकि यह केवल आधा कारण है। एक HTTP सर्वर प्रत्येक क्लाइंट कनेक्शन के लिए एक निश्चित मात्रा में मेमोरी आवंटित करता है। कीप-अलाइव के साथ, यह कनेक्शन को जीवित रखेगा, और विस्तार से यह सर्वर पर उपयोग में एक निश्चित मात्रा में मेमोरी रखेगा, जब तक की-अलाइव टाइमआउट नहीं हो जाता है, जो कि सर्वर कॉन्फ़िगरेशन के आधार पर 15 तक हो सकता है ।

इसलिए यदि हम HTTP रिवर्स प्रॉक्सी के सर्वर साइड पर कीप-अलाइव का उपयोग करने के प्रभावों पर विचार करते हैं, तो हम मेमोरी की आवश्यकता को बढ़ा रहे हैं, लेकिन क्योंकि प्रॉक्सी और सर्वर के बीच विलंबता बहुत कम है, इसलिए हमें प्रॉक्सी से कोई वास्तविक लाभ नहीं मिलता है टीसीपी के 3-वे हैंडशेक के लिए समय में कमी, इसलिए आम तौर पर इस परिदृश्य में प्रॉक्सी और वेब सर्वर के बीच कीप-अलाइव को अक्षम करना बेहतर है।

अस्वीकरण: हाँ, यह स्पष्टीकरण इस तथ्य को ध्यान में नहीं रखता है कि ब्राउज़र आमतौर पर एक सर्वर में कई HTTP कनेक्शन समानांतर में स्थापित करते हैं। हालाँकि, एक सीमा होती है कि एक ब्राउज़र एक ही होस्ट को कितने समानांतर कनेक्शन देगा, और आमतौर पर यह अभी भी काफी छोटा है, जो कि रखने के लिए वांछनीय है।


5
उत्कृष्ट स्पष्टीकरण ग्रीम के लिए कुडोस, मैंने कभी भी इतना समय नहीं बिताया कि जब भी कोई मुझसे यह पूछे, तो मैं जवाब दूंगा, और मुझे यकीन है कि अब इस पोस्ट की एक कड़ी बहुत स्पष्ट प्रतिक्रिया के रूप में रखने के लिए लिंक
दूंगा

2
अगर प्रॉक्सी और बैकएंड के बीच कनेक्शन https था, तो क्या सर्वर साइड पर रखने का कोई फायदा होगा?
avmohan

"एक HTTP सर्वर प्रत्येक क्लाइंट कनेक्शन के लिए एक निश्चित मात्रा में मेमोरी आवंटित करता है" हाँ, लेकिन उनमें से कुछ कनेक्शन (?) केवल एक लोड-बैलेंसर प्रति एक होंगे? इंटरनेट पर प्रति ग्राहक एक नहीं (?)
राएडवाल्ड

@Raedwald, यदि आपका लोड बैलेंसर प्रत्येक समर्थित सर्वर से एक HTTP कनेक्शन बनाने तक सीमित है, तो आपके पास बहुत बुरा समय आने वाला है। :-)
दैटग्रेमेय्यू

7

Nginx दोनों पक्षों पर जिंदा रखने का समर्थन करता है।


क्या आप कहेंगे कि जीवित रखना बैकएंड के लिए उपयोगी है, अगर प्रॉक्सी और बैकएंड के बीच विलंबता थी? इसके अलावा क्या जीवित कनेक्शनों की एक इष्टतम संख्या की अनुमति होगी?
CMCDragonkai

@CMCDragonkai यदि आपके बैकएंड समर्पित सर्वर पर स्थित हैं, तो कनेक्शन विलंबता से बचने के लिए उपयोगी हो सकता है जो आपके नेटवर्क पर निर्भर करता है। कोई सुनहरा मतलब नहीं है, इष्टतम संख्या मुख्य रूप से आपके सेटअप, आपके पर्यावरण, आपके आवेदन और अनुरोध पैटर्न पर निर्भर करती है।
VBart

मुझे यह हल करने के लिए एक समीकरण खोजने की उम्मीद है!
CMCDragonkai

2
यह सवाल, जैसा कि मैंने पढ़ा है, यह नहीं पूछ रहा है कि क्या नगनेक्स अपस्ट्रीम पर कीप-लाइव का समर्थन करता है, लेकिन क्या नगनेक्स अपस्ट्रीम की तरफ रखने में सक्षम है।
user45793
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.