मुझे नगीनक्स और गुनिकॉर्न जैसी चीज की आवश्यकता क्यों है?


219

मैं निम्नलिखित प्रश्न के लिए एक अति सरलीकृत उत्तर की तलाश में हूं। मैं एक मूलभूत समझ बनाने की कोशिश कर रहा हूं कि कैसे न्युनक्स Gunicorn की तरह कुछ के साथ काम करता है।

क्या मुझे Nginx और Gunicorn जैसी कुछ चीज़ों की ज़रूरत है?

यदि हां, तो क्या वास्तव में HTTP अनुरोधों को संभालता है?

Ps। मैं Apache और mod_wsgi का उपयोग नहीं करना चाहता!


अपाचे और mod_wsgi आपके django एप्लिकेशन और http अनुरोधों के बीच पुल को लागू करने का सबसे सरल तरीका है जो उत्पादन वातावरण में भी बहुत सक्षम है। कई डेवलपर्स के लिए, इसका मतलब है कि 'अपाचे नॅग्नेक्स से बेहतर है' अगर उन्होंने ऐसा किया है, लेकिन यह जानते हैं, लेकिन '
बीटामैक्स

जवाबों:


314

ओवरली सरलीकृत: आपको कुछ ऐसी चीज़ की आवश्यकता होती है जो पायथन को निष्पादित करती है लेकिन पायथन सभी प्रकार के अनुरोधों को संभालने में सबसे अच्छा नहीं है।

[अस्वीकरण: मैं एक Gunicorn डेवलपर हूं]

कम सरलीकृत: भले ही आप किस ऐप सर्वर का उपयोग करते हैं (Gunicorn, mod_wsgi, mod_uwsgi, cherrypy) किसी भी प्रकार के गैर-तुच्छ परिनियोजन में कुछ अपस्ट्रीम होगा, जो उन अनुरोधों को संभाल लेगा जो आपके Djo ऐप को संभालना नहीं चाहिए। ऐसे अनुरोधों के तुच्छ उदाहरण स्थिर संपत्ति (चित्र / सीएसएस / जेएस) परोस रहे हैं।

यह क्लासिक "थ्री टियर आर्किटेक्चर" के दो प्रथम स्तरों में परिणत होता है। यानी, वेबसर्वर (आपके मामले में Nginx) छवियों और स्थिर संसाधनों के लिए कई अनुरोधों को संभाल लेगा। अनुरोधों को गतिशील रूप से उत्पन्न करने की आवश्यकता होती है, फिर एप्लिकेशन सर्वर (आपके उदाहरण में Gunicorn) पर पारित किया जाएगा। (एक तरफ के रूप में, तीन स्तरों में से तीसरा डेटाबेस है)

ऐतिहासिक रूप से कहा जाए, तो इन स्तरों में से प्रत्येक को अलग-अलग मशीनों पर होस्ट किया जाएगा (और पहले दो स्तरों में कई मशीनें होने की संभावना होगी, अर्थात: 5 वेब सर्वर दो ऐप सर्वरों के अनुरोधों को भेजते हैं जो बदले में एक डेटाबेस से क्वेरी करते हैं)।

आधुनिक युग में अब हमारे पास सभी आकृतियों और आकारों के अनुप्रयोग हैं। हर सप्ताहांत परियोजना या छोटी व्यावसायिक साइट को वास्तव में कई मशीनों की अश्वशक्ति की आवश्यकता नहीं होती है और यह एक बॉक्स पर काफी खुशी से चलेगी। इसने होस्टिंग समाधानों की सरणी में नई प्रविष्टियों को जन्म दिया है। कुछ समाधान ऐप सर्वर से वेब सर्वर (Apache httpd + mod_wsgi, Nginx + mod_uwsgi, आदि) से विवाह करेंगे। और यह बिल्कुल नहीं है कि इन वेब / ऐप सर्वर संयोजनों में से एक के रूप में एक ही मशीन पर डेटाबेस को होस्ट करने के लिए।

अब गुनिकॉर्न के मामले में, हमने एक विशेष निर्णय लिया (रूबी की यूनिकॉर्न से नकल करते हुए) ने नग्नेक्स से अलग व्यवहार पर भरोसा करते हुए चीजों को नग्नेक्स से अलग रखने के लिए बनाया। विशेष रूप से, यदि हम यह मान सकते हैं कि Gunicorn इंटरनेट से सीधे कनेक्शन नहीं पढ़ेगा, तो हमें धीमे चलने वाले ग्राहकों के बारे में चिंता करने की आवश्यकता नहीं है। इसका मतलब यह है कि Gunicorn के लिए प्रसंस्करण मॉडल शर्मनाक सरल है।

पृथक्करण भी Gunicorn को शुद्ध पायथन में लिखने की अनुमति देता है जो प्रदर्शन को महत्वपूर्ण रूप से प्रभावित नहीं करते हुए विकास की लागत को कम करता है। यह उपयोगकर्ताओं को अन्य प्रॉक्सी का उपयोग करने की क्षमता भी देता है (यह मानते हुए कि वे सही ढंग से बफर करते हैं)।

HTTP अनुरोध को वास्तव में क्या हैंडल करता है, इस बारे में आपके दूसरे प्रश्न के रूप में, सरल उत्तर Gunicorn है। पूरा जवाब Nginx और Gunicorn दोनों अनुरोध को संभालता है। मूल रूप से, Nginx को अनुरोध प्राप्त होगा और यदि यह एक गतिशील अनुरोध है (आमतौर पर URL पैटर्न पर आधारित है), तो वह Gunicorn को वह अनुरोध देगा, जो इसे संसाधित करेगा, और फिर Nginx को एक प्रतिक्रिया लौटाएगा, जो तब मूल प्रतिक्रिया पर वापस आ जाएगी। ग्राहक।

तो समापन में, हाँ। आपको उचित Django परिनियोजन के लिए Nginx और Gunicorn (या कुछ समान) दोनों की आवश्यकता है। यदि आप विशेष रूप से Django को Nginx के साथ होस्ट करना चाह रहे हैं, तो मैं Gunicorn, mod_uwsgi, और शायद चेरीपाइ को चीजों के Django पक्ष के उम्मीदवारों के रूप में जांच करूंगा।


14
इस तरह के एक विस्तृत जवाब लिखने के लिए समय निकालने के लिए धन्यवाद! किसी भी इस "3 स्तरीय वास्तुकला" पर पढ़ने की सिफारिश की?
हूँ

5
महान जवाब, हालांकि मुझे धीमे ग्राहकों के साथ समस्या समझ में नहीं आती है।
मैड्स स्केजर्न

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


7
मेरे django ऐप केवल जसन को काम नहीं करता है कोई स्थिर सामग्री नहीं है, मैं सिर्फ gunicorn और nginx के साथ जा सकता हूं
Sar009

27

मुझे इसकी सरलता में यह स्पष्टीकरण पसंद आया:

Nginx का सामना बाहरी दुनिया से होगा। यह मीडिया फाइल (इमेज, CSS आदि) को सीधे फाइल सिस्टम से काम करेगा। हालाँकि, यह सीधे Django अनुप्रयोगों से बात नहीं कर सकता है; इसे कुछ ऐसा चाहिए जो एप्लिकेशन को चलाएगा, इसे वेब से अनुरोधों को फ़ीड करेगा, और प्रतिक्रियाएं देगा।

वह गुनिकॉर्न का काम है। Gunicorn एक यूनिक्स सॉकेट बनाएगा, और nsx को wsgi प्रोटोकॉल के माध्यम से प्रतिक्रियाएं देगा - सॉकेट दोनों दिशाओं में डेटा पास करता है:

The outside world <-> Nginx <-> The socket <-> Gunicorn

https://gist.github.com/Atem18/4696071


यह कुर्सियां ​​होना जरूरी नहीं है, बस अगर दूसरों को आश्चर्य हो रहा है।
अक्षय

0

मैं एक अति सरल उत्तर की तलाश में हूं ...

क्या मुझे Nginx और Gunicorn जैसी कुछ चीज़ों की ज़रूरत है?

यदि हां, तो क्या वास्तव में HTTP अनुरोधों को संभालता है?

अत्यधिक सरलीकृत उत्तर:

हाँ।

Nginx और Gunicorn दोनों।

चूंकि आप Nginx पर तैनात हैं, निश्चित रूप से आपको Nginx की आवश्यकता है।

जब से आप Django की तैनाती कर रहे हैं, जो एक वेब फ्रेमवर्क है, तो आपको वेब सर्वर (Nginx) और वेब फ्रेमवर्क (Django) के बीच बातचीत को तेज करने की आवश्यकता है। पायथन दुनिया में, इस तरह की चीज़ को WSGI सर्वर कहा जाता है (लेकिन इसे एक मध्य बर्तन की तरह सोचते हैं), जिसके उदाहरणों में Gunicorn और uWSGI शामिल हैं। एक अनुरोध को संभालने के दौरान, निग्नेक्स ने अनुरोध को Gunicorn या uWSGI से जोड़ दिया, जो बदले में Django कोड को कॉल करता है और प्रतिक्रिया देता है।

यह दस्तावेज़ और पॉल का जवाब आपको इसे बेहतर ढंग से सीखने में मदद करेगा।


0

Gunicorn संसाधनों की बर्बादी है। आप बस शीर्ष django पर gunicorn चलाने के बजाय पोर्ट पर सुनने के लिए प्रॉक्सी पास कर सकते हैं और फिर से इन सभी के शीर्ष पर nginx कर सकते हैं। बेंचमार्क में, मैंने बहुत ध्यान देने योग्य गति में वृद्धि देखी है। Nginx django के लिए सीधे अनुरोधों को आसानी से संभाल सकता है। Gunicorn सामान्य सड़क के ऊपर एक फ्लाईओवर (वास्तव में एक धीमी फ्लाईओवर) के अलावा और कुछ नहीं है। यह सिर्फ आपके संसाधनों को बैठता है और खाता है और आपकी वेबसाइट को शक्तिशाली बनाने का दावा करने की कोशिश करता है।

nginx मूल रूप से सभी अनुरोधों को बफ़र करता है और स्वयं द्वारा स्थिर फ़ाइल अनुरोधों को संभालता है (यदि आपने इसे इस तरह कॉन्फ़िगर किया है)। और एक अन्य सर्वर के लिए सभी गतिशील सामग्री को समीप करता है। (gunicorn / django)।

Gunicorn के पास केवल आवेदन करने के लिए अनुरोध पारित करने के अलावा कोई अन्य उपयोग नहीं है। यह एक स्ट्रॉ की तरह है जिसे आप ग्लास से सीधे पी सकते हैं या स्ट्रॉ से सीमित गति से पी सकते हैं (यहाँ पीने वाला व्यक्ति django है)। और नगनेक्स वेटर है जो आपको रस का गिलास लाया है।

मैंने बेंचमार्क किया है और इसे पाया है - गिंकोर्न के साथ: 22k req / s बिना gunicorn के: 34k req / s

आपकी साइट को भारी भार में अतिरिक्त req / s की आवश्यकता होगी।


1
आप उत्पादन में विकास सर्वर चलाने के बारे में बात कर रहे हैं ?!
माइकल हैम्पटन

विकास सर्वर को एक प्रोडक्शन सर्वर (जैसे नेग्नेक्स) के पीछे चलाया जा सकता है। क्योंकि यह सही जगह पर अनुरोध प्राप्त कर रहा होगा और सुरक्षा और दक्षता उत्पादन सर्वर द्वारा नियंत्रित किया जाएगा। यह सिर्फ WSGI + फ्लास्क का उपयोग करने जैसा है। इसके बजाय आप बस nginx + django (बिना किसी मिडलवेयर हॉगिंग, जैसे गुनकोर्न) का उपयोग कर सकते हैं। कृपया भारी लोड पर सेटअप का परीक्षण करें और आप समझ जाएंगे।
शैडोूम

1
github.com/django/channels/issues/142 (TLDR: इसका बुरा विचार)
igor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.