OpenResty और NGINX में क्या अंतर है?

API7.ai

September 9, 2022

OpenResty (NGINX + Lua)

OpenResty के फायदे स्पष्ट हैं, विस्तार से सीखने से पहले, आइए OpenResty के विकास प्रक्रिया का संक्षिप्त रूप से समीक्षा करें, जो आपको निम्नलिखित सामग्री को बेहतर ढंग से समझने में मदद करेगा।

OpenResty का विकास प्रक्रिया

OpenResty अन्य विकास भाषाओं की तरह शुरुआत से नहीं बनाया गया है, बल्कि यह परिपक्व ओपन-सोर्स घटकों - NGINX और LuaJIT पर आधारित है। OpenResty का जन्म 2007 में हुआ था, लेकिन इसका पहला संस्करण Lua को नहीं चुना, बल्कि Perl को चुना, जो लेखक की तकनीकी प्राथमिकता से बहुत कुछ करता है।

लेकिन Perl का प्रदर्शन आवश्यकताओं को पूरा करने से बहुत दूर था, इसलिए दूसरे संस्करण में Perl को Lua से बदल दिया गया। हालांकि, OpenResty के आधिकारिक प्रोजेक्ट में, Perl अभी भी एक महत्वपूर्ण भूमिका निभाता है। OpenResty इकोसिस्टम प्रोजेक्ट्स Perl के साथ बनाए गए हैं, जैसे टेस्टिंग फ्रेमवर्क, Linter, CLI, आदि। हम उन्हें बाद में क्रमिक रूप से पेश करेंगे।

क्योंकि OpenResty का उच्च प्रदर्शन और गतिशील फायदे CDN व्यावसायिक आवश्यकताओं के लिए बहुत उपयुक्त हैं, OpenResty जल्द ही CDN का तकनीकी मानक बन गया। इसके अलावा, समृद्ध lua-resty-* लाइब्रेरीज़ के माध्यम से, OpenResty ने NGINX की छाया से धीरे-धीरे बाहर निकलना शुरू कर दिया और अपना इकोसिस्टम बनाया, जो API गेटवे, सॉफ्ट WAF, और अन्य क्षेत्रों में व्यापक रूप से उपयोग किया जाता है।

मैं अक्सर कहता हूं कि OpenResty एक व्यापक रूप से उपयोग की जाने वाली तकनीक है, लेकिन यह एक लोकप्रिय तकनीक नहीं है, जो विरोधाभासी लगता है। इसका क्या मतलब है?

यह व्यापक रूप से उपयोग किया जाता है क्योंकि OpenResty अब दुनिया का पांचवां सबसे व्यापक वेब सर्वर है।

यह लोकप्रिय नहीं है क्योंकि व्यावसायिक सिस्टम बनाने के लिए OpenResty का उपयोग करने का अनुपात अधिक नहीं है। अधिकांश उपयोगकर्ता OpenResty का उपयोग इनग्रेस ट्रैफिक को प्रोसेस करने के लिए करते हैं, और वे व्यवसाय में गहराई तक नहीं जाते हैं। इसलिए स्वाभाविक रूप से, OpenResty का उपयोग केवल एक सतही स्वाद है, और यह वर्तमान आवश्यकताओं को पूरा करने के लिए पर्याप्त है। यह, निश्चित रूप से, OpenResty के पास Java और Python जैसे परिपक्व वेब फ्रेमवर्क और इकोसिस्टम की कमी से भी संबंधित है।

इतना कहने के बाद, अगले में, मैं OpenResty, एक ओपन-सोर्स प्रोजेक्ट, के कुछ स्थानों पर ध्यान केंद्रित करूंगा जो प्रशंसा और सीखने के योग्य हैं।

OpenResty के मुख्य बिंदु

विस्तृत दस्तावेज़ीकरण और टेस्ट केस

हां, दस्तावेज़ीकरण और परीक्षण यह निर्धारित करने के लिए महत्वपूर्ण संकेतक हैं कि क्या एक ओपन-सोर्स प्रोजेक्ट विश्वसनीय है, यहां तक कि कोड गुणवत्ता और प्रदर्शन से भी आगे।

OpenResty का दस्तावेज़ीकरण बहुत विस्तृत है, और लेखक ने दस्तावेज़ीकरण में हर उस बिंदु को लिखा है जिस पर ध्यान देने की आवश्यकता है। अधिकांश समय, हमें केवल दस्तावेज़ीकरण को ध्यान से देखने की आवश्यकता होती है ताकि हम जिस समस्या का सामना कर रहे हैं उसे हल कर सकें, बिना गूगल करने या सोर्स कोड को ट्रैक करने की आवश्यकता हो। सुविधा के लिए, OpenResty में एक कमांड-लाइन टूल, restydoc भी शामिल है, जो आपको शेल के माध्यम से दस्तावेज़ीकरण देखने में मदद करने के लिए डिज़ाइन किया गया है और कोडिंग प्रक्रिया में बाधा से बचाता है।

हालांकि, दस्तावेज़ीकरण में केवल एक या दो उपलब्ध कोड स्निपेट हैं, और कोई पूर्ण और जटिल उदाहरण नहीं हैं। ऐसे उदाहरण कहां मिल सकते हैं?

OpenResty के लिए, यह स्वाभाविक रूप से /t डायरेक्टरी है, जिसमें सभी टेस्ट केस शामिल हैं। प्रत्येक टेस्ट केस में पूर्ण NGINX कॉन्फ़िगरेशन और Lua कोड, साथ ही टेस्ट इनपुट और अपेक्षित आउटपुट डेटा शामिल होता है। हालांकि, OpenResty का टेस्टिंग फ्रेमवर्क अन्य एसर्शन-स्टाइल टेस्टिंग फ्रेमवर्क से पूरी तरह अलग है, जिसे मैं बाद में एक विशेष अध्याय में पेश करूंगा।

सिंक्रोनस नॉन-ब्लॉकिंग

कोरोटीन एक नई विशेषता है जिसे कई स्क्रिप्टिंग भाषाओं ने हाल के वर्षों में प्रदर्शन में सुधार के लिए जोड़ा है। लेकिन वे पूरी तरह से लागू नहीं हैं, कुछ सिंटैक्टिक शुगर हैं, और कुछ को स्पष्ट कीवर्ड घोषणाओं की आवश्यकता होती है।

OpenResty ने पहले दिन से ही कोरोटीन का समर्थन किया है और एक सिंक्रोनस नॉन-ब्लॉकिंग प्रोग्रामिंग मॉडल लागू किया है। यह महत्वपूर्ण है क्योंकि प्रोग्रामर भी इंसान हैं, और कोड को इंसानी सोच की आदतों के साथ अधिक संरेखित होना चाहिए। स्पष्ट कॉलबैक और एसिंक कीवर्ड सोच को बाधित करते हैं और डिबगिंग को कठिन बनाते हैं।

तो सिंक्रोनस नॉन-ब्लॉकिंग क्या है? पहले सिंक्रोनस के बारे में बात करते हैं। यह बहुत सरल है: कोड के अनुसार क्रमिक रूप से निष्पादित करें। उदाहरण के लिए, निम्नलिखित स्यूडोकोड:

local res, err = query-mysql(sql) local value, err = query-redis(key)

एक ही अनुरोध में, यदि हमें MySQL के क्वेरी परिणाम की वापसी की प्रतीक्षा करनी होती है तब तक Redis को क्वेरी करना जारी रखना होता है, तो यह सिंक्रोनस है; यदि हमें MySQL की वापसी की प्रतीक्षा करने की आवश्यकता नहीं है और हम Redis को क्वेरी करना जारी रख सकते हैं, तो यह एसिंक्रोनस है। OpenResty के लिए, अधिकांश सिंक्रोनस ऑपरेशन हैं। केवल बैकग्राउंड टाइमर से संबंधित API, जैसे ngx.timer एसिंक्रोनस ऑपरेशन हैं।

जहां तक नॉन-ब्लॉकिंग की बात है, जो एसिंक्रोनस के साथ आसानी से भ्रमित होने वाली अवधारणा है, जब हम यहां ब्लॉकिंग की बात करते हैं, तो हमारा मतलब ऑपरेटिंग सिस्टम थ्रेड को ब्लॉक करने से है। आइए उपरोक्त उदाहरण को देखते रहें, यह मानते हुए कि MySQL को क्वेरी करने में 1s लगता है। यदि इस 1s के दौरान, ऑपरेटिंग सिस्टम के संसाधन (CPU) निष्क्रिय हैं और मूर्खतापूर्ण रूप से वापसी की प्रतीक्षा कर रहे हैं, तो यह ब्लॉकिंग है; यदि CPU इस अवसर का उपयोग करके अन्य कनेक्शन अनुरोधों को प्रोसेस करता है, तो यह नॉन-ब्लॉकिंग है। नॉन-ब्लॉकिंग C10K और C100K जैसे उच्च समवर्ती को प्राप्त करने की कुंजी भी है।

सिंक्रोनस नॉन-ब्लॉकिंग की अवधारणा महत्वपूर्ण है। हालांकि, मेरी राय में, इस अवधारणा को अनुरूपता से समझने की कोशिश नहीं करनी चाहिए क्योंकि अनुचित अनुरूपता आपको और भी अधिक भ्रमित कर सकती है।

OpenResty में, उपरोक्त स्यूडोकोड स्पष्ट कीवर्ड के बिना सीधे सिंक्रोनस नॉन-ब्लॉकिंग प्राप्त कर सकता है। यहां फिर से यह प्रतिबिंबित होता है कि डेवलपर्स के लिए उपयोग करना आसान बनाना OpenResty की अवधारणाओं में से एक है।

गतिशीलता

OpenResty का एक बड़ा फायदा, जिसका पूरी तरह से उपयोग नहीं किया गया है, वह है इसकी गतिशीलता।

पारंपरिक वेब सर्वर, जैसे NGINX, हमें डिस्क पर कॉन्फ़िगरेशन फ़ाइल को संशोधित करने और इसे पुनः लोड करने की आवश्यकता होती है यदि कोई परिवर्तन होता है, क्योंकि वे रनटाइम व्यवहार को नियंत्रित करने के लिए API प्रदान नहीं करते हैं। इसलिए, माइक्रोसर्विसेज में जहां बार-बार परिवर्तन की आवश्यकता होती है, NGINX ने कई बार प्रयास किया है, लेकिन कुछ भी सुधार नहीं हुआ है। और Envoy का अचानक उभरना, xDS के गतिशील नियंत्रण API के साथ, NGINX के लिए एक बड़ा खतरा पैदा करता है।

NGINX और Envoy के विपरीत, OpenResty स्क्रिप्टिंग भाषा Lua द्वारा नियंत्रित होता है, और गतिशीलता Lua का प्राकृतिक फायदा है। उदाहरण के लिए, OpenResty में lua-nginx-module मॉड्यूल में प्रदान किए गए Lua API के माध्यम से, हम गतिशील रूप से रूट, अपस्ट्रीम, SSL सर्टिफिकेट, अनुरोध, प्रतिक्रिया, आदि को नियंत्रित कर सकते हैं। और भी आगे, हम OpenResty को पुनः स्टार्ट किए बिना व्यवसाय के प्रोसेसिंग लॉजिक को संशोधित कर सकते हैं, OpenResty द्वारा प्रदान किए गए Lua API तक सीमित नहीं हैं।

यहां एक उत्कृष्ट अनुरूपता है जो आपको ऊपर कही गई गतिशीलता को समझने में मदद करेगी। बस एक वेब सर्वर को एक कार के रूप में सोचें जो हाईवे पर तेज गति से चल रही है, NGINX को टायर बदलने और पेंट रंग बदलने के लिए रुकना पड़ता है; Envoy चलते समय टायर और रंग बदल सकता है; और OpenResty, पूर्व क्षमताओं के अलावा, बिना पार्किंग के एक SUV में भी बदल सकता है।

इस जादुई क्षमता को महारत हासिल करने के बाद, OpenResty की क्षमता और कल्पना का दायरा अन्य क्षेत्रों, जैसे Serverless और Edge कंप्यूटिंग, तक विस्तारित हो गया है।

क्या सीखना चाहिए?

OpenResty के इतने महत्वपूर्ण फीचर्स के बारे में बात करने के बाद, हमें क्या सीखना चाहिए? मैं मुख्य लाइन पर ध्यान केंद्रित करना पसंद करता हूं, बजाय कि हर छोटी-बड़ी बात को पकड़ने की कोशिश करने के, ताकि हम एक स्पष्ट संदर्भ के साथ ज्ञान प्रणाली बना सकें।

आपको यह जानना चाहिए कि कोई भी कोर्स कितना भी व्यापक क्यों न हो, यह सभी समस्याओं को कवर करने में असमर्थ है और सीधे तौर पर आपको हर बग और अपवाद को ऑनलाइन हल करने में मदद नहीं कर सकता है।

OpenResty के अध्ययन पर वापस जाते हुए, मेरी राय में, यदि आप OpenResty को अच्छी तरह से सीखना चाहते हैं, तो आपको निम्नलिखित आठ मुख्य बिंदुओं को समझना चाहिए:

  • सिंक्रोनस नॉन-ब्लॉकिंग प्रोग्रामिंग मॉडल
  • विभिन्न अनुरोध/प्रतिक्रिया चरणों की भूमिका
  • LuaJIT और Lua के बीच अंतर
  • OpenResty API और आसपास की लाइब्रेरीज़
  • कोरोटीन और cosocket
  • यूनिट टेस्टिंग फ्रेमवर्क और प्रदर्शन परीक्षण उपकरण
  • फ्लेम ग्राफ और आसपास के टूलचेन
  • प्रदर्शन अनुकूलन

ये बिंदु हमारे अध्ययन में आवश्यक हैं, और मैं उन्हें प्रत्येक अध्याय में अलग-अलग चर्चा करूंगा। हालांकि, सीखने की प्रक्रिया में, मैं आशा करता हूं कि आप एक मामले से अनुमान लगा सकते हैं और अपनी रुचि और पृष्ठभूमि के अनुसार कुछ अध्यायों को गहराई से पढ़ सकते हैं।

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

यदि आप अपने प्रोजेक्ट में OpenResty का उपयोग कर रहे हैं, तो यह बहुत अच्छा है! हालांकि, मुझे विश्वास है कि जब आप LuaJIT और प्रदर्शन अनुकूलन अध्याय पढ़ेंगे, तो आपको अधिक प्रतिध्वनि और अधिक व्यावहारिक अनुप्रयोग मिलेंगे और अपने प्रोजेक्ट में अनुकूलन से पहले और बाद के प्रदर्शन में सुधार देखेंगे।

इसके अलावा, यदि आप OpenResty और आसपास की लाइब्रेरीज़ में कोड योगदान करना चाहते हैं, तो सबसे बड़ी बाधा OpenResty के सिद्धांतों को समझना या NGINX C मॉड्यूल लिखना नहीं है, बल्कि टेस्ट केस और कोड स्पेसिफिकेशन हैं। मैंने बहुत सारे OpenResty योगदानकर्ताओं (मेरे सहित) को एक PR पर बार-बार टेस्ट केस और कोड स्टाइल को संशोधित करते देखा है, और बहुत सारे अलिखित नियम हैं। इसलिए, कोर्स का कोड स्पेसिफिकेशन और यूनिट टेस्टिंग सेक्शन आपके लिए है।

और यदि आप एक QA इंजीनियर हैं, तो भले ही आप OpenResty का उपयोग न करें, OpenResty का टेस्टिंग फ्रेमवर्क और प्रदर्शन विश्लेषण टूलसेट आपको बहुत प्रेरणा देगा। आखिरकार, OpenResty का टेस्टिंग में निवेश और संचय काफी गहरा है।

आगे पढ़ने के लिए