आपका पहला OpenResty प्रोग्राम: Hello World

API7.ai

September 9, 2022

OpenResty (NGINX + Lua)

जब हम एक नई डेवलपमेंट भाषा सीखना शुरू करते हैं, तो ट्यूटोरियल्स एक सरल hello world केस प्रदान करते हैं। तो आइए पहले इंस्टॉलेशन को छोड़कर देखें कि OpenResty में इस केस को कैसे लिखा जाए:

$ resty -e "ngx.say('hello world')" hello world

यह आपके द्वारा देखा गया सबसे सीधा hello world कोड होना चाहिए, जो Python के समान है:

$ python -c 'print("hello world")' hello world

इसके पीछे OpenResty के दर्शन की अभिव्यक्ति है। कोड इतना संक्षिप्त होना चाहिए कि आप "प्रवेश से हार मानने" के विचार से छुटकारा पा सकें। यह पोस्ट hello world केस पर ध्यान केंद्रित करेगी।

जैसा कि हमने OpenResty और NGINX में क्या अंतर है पोस्ट में कहा था, OpenResty NGINX पर आधारित है। तो आपके मन में एक सवाल हो सकता है: यहां हमें NGINX की छाया क्यों नहीं दिख रही है? चिंता न करें, आइए एक लाइन कोड जोड़कर देखें कि resty के पीछे क्या चल रहा है:

$ resty -e "ngx.say('hello world'); ngx.sleep(10)" &

हमने ngx.sleep मेथड जोड़ा है ताकि प्रोग्राम स्ट्रिंग hello world प्रिंट करने के बाद बाहर न निकले। इस तरह, हमें पता लगाने का मौका मिलता है:

$ ps -ef | grep nginx root 15944 6380 0 13:59 pts/6 00:00:00 grep --color=auto nginx

अंत में NGINX प्रक्रिया दिखाई देती है! ऐसा लगता है कि resty कमांड मूल रूप से एक NGINX सेवा शुरू करता है, तो resty क्या है?

हो सकता है कि आपकी मशीन पर OpenResty इंस्टॉल न हो, इसलिए आगे बढ़ने से पहले, आइए शुरुआत में छोड़े गए इंस्टॉलेशन चरणों पर वापस जाएं और OpenResty इंस्टॉल करें।

इंस्टॉलेशन

अन्य ओपन सोर्स सॉफ्टवेयर की तरह, हम OpenResty को विभिन्न तरीकों से इंस्टॉल कर सकते हैं, जैसे कि ऑपरेटिंग सिस्टम के पैकेज मैनेजर का उपयोग करके, सोर्स कोड से कंपाइल करके, या डॉकर इमेज का उपयोग करके। हालांकि, मैं आपको सलाह दूंगा कि पहले yum, apt-get, और brew जैसे पैकेज मैनेजर का उपयोग करके OpenResty इंस्टॉल करें। इस पोस्ट में, मैं macOS को उदाहरण के रूप में उपयोग करूंगा:

$ brew tap openresty/brewbrew install openresty

अन्य ऑपरेटिंग सिस्टम का उपयोग करना समान है। पहले, OpenResty रिपॉजिटरी का URL पैकेज मैनेजर में जोड़ें, और फिर पैकेज मैनेजर का उपयोग करके OpenResty इंस्टॉल करें। अधिक विस्तृत चरणों के लिए, आप आधिकारिक दस्तावेज़ का संदर्भ ले सकते हैं।

हालांकि, इस सरल इंस्टॉलेशन के पीछे दो समस्याएं हैं:

  1. मैं सोर्स कोड से इंस्टॉल करने की सलाह क्यों नहीं देता?
  2. इसे ऑपरेटिंग सिस्टम के आधिकारिक रिपॉजिटरी से सीधे इंस्टॉल क्यों नहीं किया जा सकता, बल्कि पहले एक और रिपॉजिटरी सेट करने की आवश्यकता क्यों है?

कृपया पहले उन दो सवालों के बारे में सोचें।

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

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

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

आइए विषय पर वापस आते हैं। OpenResty सोर्स कोड से इंस्टॉल करने के लिए, न केवल चरण जटिल हैं, आपको PCRE, OpenSSL जैसे बाहरी निर्भरताओं को हल करने की आवश्यकता है, बल्कि आपको संबंधित OpenSSL संस्करण को मैन्युअल रूप से पैच करने की भी आवश्यकता है। अन्यथा, SSL sessions को संभालते समय कार्यक्षमता की कमी होगी। उदाहरण के लिए, ngx.sleep जैसे Lua APIs जो yield का कारण बनते हैं, का उपयोग नहीं किया जा सकता है। यदि आप इस भाग के बारे में अधिक जानना चाहते हैं, तो आप आधिकारिक दस्तावेज़ का संदर्भ ले सकते हैं।

OpenResty उन पैचों को OpenSSL पैकेज स्क्रिप्ट में स्वयं बनाए रख रहा है। जब OpenResty OpenSSL संस्करण को अपग्रेड करता है, तो उसे संबंधित पैच को पुनः उत्पन्न करना होगा और पूर्ण रिग्रेशन टेस्टिंग करनी होगी।

Source0: https://www.openssl.org/source/openssl-%{version}.tar.gz Patch0: https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.0d-sess_set_get_cb_yield.patch Patch1: https://raw.githubusercontent.com/openresty/openresty/master/patches/openssl-1.1.0j-parallel_build_fix.patch

साथ ही, हम CentOS में OpenResty की पैकेज स्क्रिप्ट को देख सकते हैं कि क्या अन्य छिपे हुए बिंदु हैं:

BuildRequires: perl-File-Temp BuildRequires: gcc, make, perl, systemtap-sdt-devel BuildRequires: openresty-zlib-devel >= 1.2.11-3 BuildRequires: openresty-openssl-devel >= 1.1.0h-1 BuildRequires: openresty-pcre-devel >= 8.42-1 Requires: openresty-zlib >= 1.2.11-3 Requires: openresty-openssl >= 1.1.0h-1 Requires: openresty-pcre >= 8.42-1

जैसा कि आप यहां देख सकते हैं, OpenResty अपने संस्करण के OpenSSL और अपने संस्करण के zlib और PCRE को बनाए रखता है। हालांकि, बाद वाले दो ने कंपाइलेशन पैरामीटर्स को समायोजित किया है और उनके पैच को संरक्षित नहीं किया है।

इसलिए, इन कारकों को ध्यान में रखते हुए, मैं सोर्स कोड से OpenResty को कंपाइल करने की सलाह नहीं देता, जब तक कि आप पहले से ही विवरण न जानते हों।

आपके लिए यह स्पष्ट होना चाहिए कि सोर्स इंस्टॉलेशन की सिफारिश क्यों नहीं की जाती है। जब हमने पहले सवाल का जवाब दिया, तो हमने दूसरे सवाल का भी जवाब दिया: हम इसे ऑपरेटिंग सिस्टम के आधिकारिक पैकेज रिपॉजिटरी से सीधे क्यों नहीं इंस्टॉल कर सकते, बल्कि पहले एक और रिपॉजिटरी सेट करने की आवश्यकता क्यों है?

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

OpenResty CLI

OpenResty इंस्टॉल करने के बाद, OpenResty CLI resty डिफ़ॉल्ट रूप से पहले से ही इंस्टॉल हो जाता है। यह एक Perl स्क्रिप्ट है, और जैसा कि हमने पहले कहा था, OpenResty इकोसिस्टम टूल्स सभी Perl में लिखे गए हैं, जो OpenResty लेखक की तकनीकी प्राथमिकता द्वारा निर्धारित है।

$ which resty /usr/local/bin/resty $ head -n 1 /usr/local/bin/resty #!/usr/bin/env perl

resty CLI बहुत शक्तिशाली है, और हम resty -h का उपयोग कर सकते हैं या आधिकारिक दस्तावेज़ को पढ़ सकते हैं। आगे, मैं दो रोचक सुविधाओं का परिचय दूंगा।

$ resty --shdict='dogs 1m' -e 'local dict = ngx.shared.dogs dict:set("Tom", 56) print(dict:get("Tom"))' 56

उपरोक्त उदाहरण एक Nginx कॉन्फ़िगरेशन को दिखाता है जिसमें Lua कोड है, जो एक साझा मेमोरी डिक्शनरी सेटअप और क्वेरी को पूरा करता है। dogs 1m एक Nginx कॉन्फ़िगरेशन है जो dogs नामक एक साझा मेमोरी स्पेस को 1m आकार के साथ घोषित करता है। साझा मेमोरी का उपयोग Lua कोड में एक डिक्शनरी के रूप में किया जाता है।

इसके अलावा, --http-include और --main-include पैरामीटर्स का उपयोग NGINX कॉन्फ़िगरेशन फ़ाइल सेटअप करने के लिए किया जाता है, इसलिए हम उपरोक्त उदाहरण को इस तरह से फिर से लिख सकते हैं:

$ resty --http-conf 'lua_shared_dict dogs 1m;' -e 'local dict = ngx.shared.dogs dict:set("Tom", 56) print(dict:get("Tom"))'

OpenResty दुनिया में मानक डिबगिंग टूल्स, जैसे gdb, valgrind, sysetmtap, और Mozilla rr का भी उपयोग resty के साथ किया जा सकता है ताकि सामान्य विकास और परीक्षण को सुविधाजनक बनाया जा सके। उनके पास resty के विभिन्न कमांड्स के अनुरूप हैं, इसलिए आंतरिक कार्यान्वयन सरल है, बस कमांड लाइन कॉल्स की एक अतिरिक्त परत है। आइए valgrind को एक उदाहरण के रूप में लेते हैं।

$ resty --valgrind -e "ngx.say('hello world'); " ERROR: failed to run command "valgrind /usr/local/openresty/nginx/sbin/nginx -p /tmp/resty_rJeOWaYGIY/ -c conf/nginx.conf": No such file or directory

वे न केवल OpenResty दुनिया के लिए लागू हैं, बल्कि सर्वर साइड के लिए सामान्य टूल्स भी हैं, इसलिए आइए उन्हें क्रमशः सीखें।

अधिक औपचारिक "hello world"

हमने शुरुआत में लिखा पहला OpenResty प्रोग्राम, resty कमांड का उपयोग करके बिना master प्रक्रिया के और बिना विशिष्ट पोर्ट्स पर सुनने के लिए था। अगले, आइए एक और hello world प्रोग्राम को लागू करें।

इसे पूरा करने के लिए हमें कम से कम तीन चरणों की आवश्यकता होगी।

  1. एक कार्यशील डायरेक्टरी बनाएं।
  2. NGINX कॉन्फ़िगरेशन फ़ाइल को संशोधित करें ताकि इसमें Lua कोड एम्बेड हो।
  3. OpenResty सेवा शुरू करें।

आइए पहले एक कार्यशील डायरेक्टरी बनाकर शुरू करें।

$ mkdir openresty-sample $ cd openresty-sample $ mkdir logs/ conf/

निम्नलिखित एक मिनिमलिस्ट nginx.conf है जिसमें OpenResty का content_by_lua डायरेक्टिव रूट डायरेक्टरी में है, जो ngx.say मेथड को एम्बेड करता है।

events { worker_connections 1024; } http { server { listen 8080; location / { content_by_lua ' ngx.say("hello, world") '; } } }

कृपया सुनिश्चित करें कि openresty को पहले PATH पर्यावरण में जोड़ा गया है; फिर, OpenResty सेवा शुरू करें:

$ openresty -p `pwd` -c conf/nginx.conf

यदि कोई त्रुटि नहीं हुई है, तो OpenResty सेवा सफलतापूर्वक शुरू हो गई है। हम इसे cURL कमांड का उपयोग करके एक्सेस कर सकते हैं और लौटे परिणाम देख सकते हैं।

$ curl -i 127.0.0.1:8080 HTTP/1.1 200 OK Server: openresty/1.13.6.2 Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive hello, world

बधाई हो! OpenResty में औपचारिक Hello World पूरा हो गया है!

सारांश

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

इसमें, resty एक कमांड-लाइन टूल है जिसका हम भविष्य में बार-बार उपयोग करेंगे। इसलिए, कोर्स में डेमो कोड इसे चलाने के लिए है, न कि पृष्ठभूमि में OpenResty सेवा शुरू करने के लिए।

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