2012-02-10 9 views
5

सारांश/quesiton:क्या मैं प्रीफेर्क एमपीएम के तहत अपाचे मोड_प्रैक्सी को कनेक्शन पूल के रूप में उपयोग कर सकता हूं?

मैं अपाचे prefork एम पी एम के साथ चल रहा है, php चल रहा है। मैं अपाचे mod_proxy उपयोग करने के लिए एक रिवर्स प्रॉक्सी है कि मैं के माध्यम से पुन: रूट कर सकते हैं मेरे अनुरोध, ताकि मैं कनेक्शन पूलिंग करने के लिए अपाचे का उपयोग कर सकते बनाने के लिए कोशिश कर रहा हूँ। उदाहरण impl:

httpd.conf में

:

curl -G 'http://localhost:80/test_proxy/testpage' 

यह फिर से दिखाई नहीं देता:

SSLProxyEngine On 
ProxyPass /test_proxy/ https://destination.server.com/ min=1 keepalive=On ttl=120 

लेकिन जब मैं अपने परीक्षण है, जो एक पाश में निम्न आदेश है चलाने कनेक्शन का उपयोग करें।

कुछ आगे पढ़ने के बाद, यह लग रहा है जैसे मैं कनेक्शन पूल कार्यक्षमता क्योंकि मैं prefork एम पी एम के बजाय कार्यकर्ता एम पी एम उपयोग कर रहा हूँ नहीं मिल रहा है। इसलिए जब भी मैं प्रॉक्सी के लिए एक अनुरोध करते हैं, तो अपने आप ही कनेक्शन पूल (आकार एक की) के साथ एक नई प्रक्रिया है, बजाय एक कार्यकर्ता हैं जो स्वयं के पूल को बनाए रखता है का उपयोग करने का घूमती है। क्या यह व्याख्या सही है?


पृष्ठभूमि जानकारी:

वहाँ किसी बाहरी सर्वर है कि मैं अनुरोध करने के लिए है, https पर, एक साइट है कि मैं चलाने पर मारा प्रत्येक पृष्ठ के लिए।

एसएसएल हैंडशेक पर बातचीत करना महंगा हो रहा है, क्योंकि मैं PHP का उपयोग करता हूं और यह कनेक्शन पूलिंग का समर्थन नहीं करता है - अगर मुझे अपनी साइट पर 300 पेज अनुरोध मिलते हैं, तो उन्हें बाहरी सर्वर पर 300 एसएसएल हैंडशेक करना पड़ता है, क्योंकि प्रत्येक स्क्रिप्ट चलने के बाद कनेक्शन बंद हो जाते हैं।

इसलिए मैं अपाचे के तहत एक रिवर्स प्रॉक्सी का उपयोग कनेक्शन कनेक्शन के रूप में कार्य करने के लिए कर रहा हूं, PHP प्रक्रियाओं में कनेक्शन को बनाए रखने के लिए, इसलिए मुझे अक्सर एसएसएल हैंडशेक नहीं करना पड़ता है।

सूत्रों का कहना है कि मुझे इस विचार दिया:

उत्तर

1

prefork अभी भी प्रक्रिया प्रति बैकएंड सर्वर प्रति 1 कनेक्शन पूल कर सकते हैं।

prefork जरूरी एक नई प्रक्रिया का निर्माण नहीं करता प्रत्येक दृश्यपटल अनुरोध के लिए, सर्वर प्रक्रियाओं "जमा" कर रहे हैं खुद को और व्यवहार पर निर्भर करता है जैसे MinSpareServers/MaxSpare सर्वर और दोस्तों।

अधिकतम करने के लिए कितनी बार प्रीफ़ोर प्रक्रिया आपके लिए बैकएंड कनेक्शन होगी, बहुत अधिक या निम्न maxspareservers या बहुत अधिक minspareservers से बचें क्योंकि इनके परिणामस्वरूप "ताजा" प्रक्रियाएं नए कनेक्शन को स्वीकार करेंगी।

आप अपने LogFormat निर्देश में% पी लॉग इन करने में मदद करने के एक विचार प्राप्त करता है, तो कितनी बार प्रक्रियाओं पुन: उपयोग किया जा रहा है कर सकते हैं।

+0

उत्तर के लिए धन्यवाद। इससे मुझे यह समझने में बहुत मदद मिली कि MPM_prefork का उपयोग करके कनेक्शन पूलिंग भी संभव है या नहीं। अपाचे दस्तावेज़ विज्ञापन भी डीबग स्तर में mod_proxy लॉगिंग भी कनेक्शन के दोबारा उपयोग किए जाने के बारे में बहुत स्पष्ट नहीं है। मेरे मामले में यह रिवर्स प्रॉक्सी नहीं था लेकिन बैकएंड सर्वर समस्या थी। इसने 'उपयोगकर्ता-एजेंट' HTTP शीर्षलेख का निरीक्षण करके ब्राउज़र को एक एमएसआईई होने का पता लगाया और इस प्रकार प्रत्येक अनुरोध के अंत में एसएसएल कनेक्शन बंद कर रहा था। यही कारण है कि रिवर्स प्रॉक्सी बैकएंड सर्वर पर एसएसएल कनेक्शन का फिर से उपयोग नहीं कर रहा था। – BertNase

+0

500 आपकी है, क्योंकि आपकी टिप्पणी ने मुझे यह समझने में मदद की कि क्या हो रहा था, मैं अपने मामले में समस्याओं का समाधान करने के लिए एक उत्तर पोस्ट करूंगा। – BertNase

2

सबसे पहले, अपने परीक्षण विधि हर कॉल के लिए के बाद से कनेक्शन पूलिंग को प्रदर्शित नहीं कर सकते, एक कर्ल ग्राहक पैदा हुआ और फिर यह मर जाता है। मृत लोगों की तरह बहुत बात नहीं करते हैं, एक मृत प्रक्रिया एक कनेक्शन को जीवित नहीं रख सकती है।

आपके पास ऐसे ग्राहक हैं जो आपके प्रॉक्सी सर्वर को परेशान करते हैं।

Client ====== (A) =====> ProxyServer 

चलो इस कनेक्शन को कॉल करें। आपका प्रॉक्सी सर्वर कुछ भी नहीं करता है, यह सिर्फ एक शो है। सुन्दर और मेहनती सर्वर इतना विनम्र है कि वह पीछे छिपा हुआ है।

Client ====== (A) =====> ProxyServer ====== (B) =====> WebServer 

यहां, अगर मैं गलत नहीं हूं, तो सुरक्षित कनेक्शन ए है, बी नहीं, है ना?

अपने पहले बिंदु को दोहराएं, अपने परीक्षण पर, आप प्रत्येक अनुरोध के लिए एक अलग ग्राहक बना रहे हैं। प्रत्येक ग्राहक को एक अलग कनेक्शन की जरूरत है। कनेक्शन कुछ ऐसा होता है जो कम से कम दो पार्टियों के बीच होता है। एक तरफ पत्तियां और कनेक्शन खो गया है।

ठीक है, चलो अब कर्ल भूल जाएं और हम वास्तव में क्या करना चाहते हैं उस पर एक साथ देखें।

हम एएस पर एसएसएल चाहते हैं और हम चाहते हैं कि यातायात का एक पक्ष जितना तेज़ हो सके। इस उद्देश्य के लिए, हमने पहले से ही पक्ष बी को अलग कर दिया है, इसलिए यह ए को धीमा नहीं करेगा, है ना?

कनेक्शन पूलिंग? ए में कनेक्शन पूलिंग जैसी कोई चीज नहीं है। प्रत्येक ग्राहक आता है और बहुत शोर करता है। केवल एक चीज जो आपको इस शोर को कम करने में मदद कर सकती है वह है "Keep-Alive" जिसका अर्थ है, से क्लाइंट से कुछ समय के लिए कनेक्शन को जीवित रखना ताकि यह वही ग्राहक अन्य अनुरोधों के लिए पूछ सके जो इस अनुरोध से आवश्यक होंगे । जब हम कर लेंगे, हम कर रहे हैं।

बी पर कनेक्शन के लिए, कनेक्शन पूल किए जाएंगे; लेकिन यह आपको एक सर्वर सेटअप के बाद से कोई प्रदर्शन नहीं लाएगा, आपके पास शोर उत्पादन का यह हिस्सा नहीं था।

हम इस प्रणाली को तेजी से कैसे चलाने में मदद करते हैं?

यदि ये दो सर्वर एक ही मशीन पर हैं, तो हमें शो-ऑफ सर्वर से छुटकारा पाना चाहिए और हमारे मेहनती वेबसर्वर के साथ जारी रखना चाहिए। यह प्रणाली के लिए बहुत अनावश्यक काम जोड़ता है।

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

यदि आप अपाचे पर जारी रखना चाहते हैं, तो mpm_prefork से mpm_worker पर स्विच करें। 300+ समवर्ती अनुरोधों के मामले में, यह बहुत बेहतर काम करेगा। मुझे वास्तव में आपके हार्डवेयर की क्षमता के बारे में कोई जानकारी नहीं है; लेकिन अगर 300 अनुरोधों को संभालना मुश्किल है, तो मेरा मानना ​​है कि यह छोटा बदलाव आपके सिस्टम को बहुत मदद करेगा।

यदि आप एक और अधिक हल्के सिस्टम चाहते हैं, तो अपाचे के विकल्प के रूप में nginx पर विचार करें। PHP के साथ काम करने के लिए यह बहुत easy to setup है और इसका बेहतर प्रदर्शन होगा।

चीजों के सामने वाले पक्ष के अलावा, अपने डेटाबेस सर्वर की जांच करने पर भी विचार करें। कनेक्शन पूलिंग यहां वास्तविक अंतर करेगी। सुनिश्चित करें कि क्या आपकी PHP स्थापना डेटाबेस से कनेक्शन का पुन: उपयोग करने के लिए कॉन्फ़िगर किया गया है।

इसके अलावा, यदि आप एक ही सिस्टम पर स्टैटिक फ़ाइलें होस्ट कर रहे हैं, तो उन्हें बाहर या तो एक और वेब सर्वर पर ले जाने या की तरह CDN के साथ कोई बादल प्रणाली के लिए स्थिर फ़ाइलों को ले जाकर भी बेहतर कर एडब्ल्यूएस के S3 + CloudFront या Rackspace's CloudFiles। क्लाउडफ्रंट के बिना भी, एस 3 आपको खुश कर देगा। रैकस्पेस का समाधान अकामाई के साथ आता है!

स्थिर फाइलें लेना आपके वेब सर्वर को "ओह क्या हुआ, यह चुप्पी क्या है? ओह स्वर्ग!" चूंकि आपने इसका उल्लेख किया है कि वेबसाइट और वेब पृष्ठों में अधिकांश गतिशील रूप से जेनरेट किए गए HTML पृष्ठ के लिए कई स्थिर फ़ाइलें होती हैं।

मुझे आशा है कि आप गरीब व्यक्ति को हत्यारे के काम से बचा सकते हैं।

+0

प्रश्न पर उस बहुत लंबे उत्तर के लिए धन्यवाद। हां, सवाल यह था कि (बी) कनेक्शन पर कनेक्शन पूलिंग कैसे स्थापित करें। रिवर्स प्रॉक्सीइंग एक रिवर्स प्रॉक्सी के पीछे सभी 'काम करने वाले' सर्वरों को छिपाने के लिए एक सुरक्षा अवधारणा है, गेम से प्रॉक्सी लेना एक विकल्प नहीं है। प्रॉक्सी और बैकएंड सर्वर के बीच (बी) कनेक्शन से एसएसएल को हटाने का विकल्प एक विकल्प नहीं है, क्योंकि प्रॉक्सी सर्वर बैकएंड सर्वर से कनेक्ट करने के लिए एकमात्र सर्वर है और यह सुनिश्चित करने का एकमात्र तरीका है कि यह म्यूचुअल एसएसएल ऑथ का उपयोग कर रहा है बेकेंड सर्वर के खिलाफ प्रॉक्सी प्रमाणीकृत करने के लिए। – BertNase

+0

कनेक्शन (बी) पर कनेक्शन पूलिंग से प्राप्त लाभ मैं एसएसएल हैंडशेक ओवरहेड को हटा रहा हूं। हैंडशेक महंगा चीज है - 300-500 एमएमएस। पहले से स्थापित पूल किए गए SSL कनेक्शन पर बाद के अनुरोध को चलाने से बैकएंड-सर्वर के अनुरोध निष्पादन समय पर केवल 20ms जोड़े जाते हैं। तो लक्ष्य पूल कनेक्शन का उपयोग न करने पर प्रत्येक अनुरोध पर 300-500ms जुर्माना को हटाना है। – BertNase

+0

असल में मैंने पिछले दिनों के दौरान MPM_worker पर स्विच किया और कनेक्शन पूलिंग स्थापित करने में कामयाब रहा। तो मेरी प्रारंभिक समस्या अब हल हो गई है। MPM_Prefork का उपयोग करके इसे प्राप्त करने के अपने प्रयासों के दौरान मुझे कुछ समस्याएं आईं और इस प्रश्न में आया और मुझे एमपीएम_Prefork का उपयोग करके इसे बनाने के बारे में कुछ संकेत देने के लिए एक उपहार दिया। जैसा कि यह निकला, मूल पोस्ट में बताए गए अपाचे बग ने केवल अपाचे 2.2 संस्करणों के लिए लागू किया और मेरे अपाचे 2.2.22 में मौजूद नहीं था। तो कनेक्शन पूलिंग मेरे लिए एमपीएम_Prefork और MPM_worker दोनों में काम किया, नीचे मेरी टिप्पणी देखें। – BertNase

0

मेरे मामले में समस्या यह थी कि रिवर्स प्रॉक्सी और बैकएंड सर्वर के बीच कनेक्शन पूलिंग बैकएंड सर्वर अपाचे के कारण प्रत्येक HTTPS अनुरोध के अंत में SSL कनेक्शन को बंद करने के कारण नहीं हो रहा था।

बैकएंड अपाचे सर्वर httpd.conf में मौजूद होने निम्नलिखित निर्देशक के becuse यह कर रहा था:

SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown 

यह निर्देश भावना जब बैकएंड सर्वर एक रिवर्स प्रॉक्सी के माध्यम से जुड़ा हुआ है नहीं है और इस हटाया जा सकता है बैकएंड सर्वर कॉन्फ़िगरेशन से।

संबंधित मुद्दे

 संबंधित मुद्दे