ओपनरेस्टी के पीछे के सबप्रोजेक्ट्स

API7.ai

September 12, 2022

OpenResty (NGINX + Lua)

nginx.conf से Lua कोड को कैसे निकालें और इसे पठनीय और रखरखाव योग्य बनाएं? समाधान काफी सरल है। आइए देखें कि इसे OpenResty द्वारा कैसे लागू किया जाए।

सबसे पहले, lua नामक एक डायरेक्टरी बनाएं। फिर, हम सभी .lua फाइलों को इसमें रखेंगे।

$ mkdir lua $ cat lua/hello.lua ngx.say("hello, world")

दूसरा, nginx.conf फाइल में content_by_lua_file को content_by_lua_block से बदलें।

pid logs/nginx.pid; events { worker_connections 1024; } http { server { listen 8080; location / { content_by_lua_file lua/hello.lua; } } }

तीसरा, OpenResty की सेवाओं को पुनः आरंभ करें, और यह हो गया!

$ sudo kill -HUP `cat logs/nginx.pid`

content_by_lua_file का उपयोग करके, हम Lua फाइल को सीधे अपडेट कर सकते हैं, nginx.conf को अपडेट करने के बजाय। लेकिन कुछ प्रश्न हैं:

  1. हम content_by_lua_file lua/hello.lua सेक्शन में एक रिलेटिव पथ का उपयोग करते हैं। OpenResty वास्तविक Lua फाइल को कैसे ढूंढता है?
  2. Lua कोड को संशोधित करने के बाद, हमें इसे काम करने के लिए OpenResty को पुनः आरंभ करने की आवश्यकता होती है, क्या कोई तरीका है जिससे हम इसे कुशलता से डीबग कर सकें?
  3. Lua फाइलों वाली डायरेक्टरी को OpenResty के लुकअप पथ में कैसे जोड़ें?

मैं आपको इन प्रश्नों के बारे में सोचने के लिए प्रोत्साहित करता हूं, जिनका उत्तर आधिकारिक दस्तावेज़ीकरण में मिल सकता है। यही कारण है कि मैं हमेशा दस्तावेज़ीकरण के महत्व पर जोर देता हूं।

पहले प्रश्न के लिए, यदि रिलेटिव पथ दिया गया है, तो जब OpenResty शुरू होता है, तो यह OpenResty स्टार्टअप कमांड लाइन पैरामीटर्स में -p PATH को प्रीफिक्स करेगा और रिलेटिव पथ को एक एब्सोल्यूट पथ में जोड़ देगा। इस तरह, OpenResty Lua फाइल को आसानी से ढूंढ सकता है।

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

अंतिम प्रश्न के लिए, OpenResty Lua मॉड्यूल के लिए लुकअप पथ सेट करने के लिए lua_package_path डायरेक्टिव प्रदान करता है। उदाहरण के लिए, हम lua_package_path को $prefix/lua/?.lua;; सेट कर सकते हैं:

  • $prefix स्टार्टअप पैरामीटर में -p PATH है।
  • /lua/?.lua .lua सफ़िक्स वाली Lua डायरेक्टरी में सभी फाइलों को इंगित करता है।
  • अंतिम दो सेमीकोलन बिल्ट-इन कोड सर्च पथ को दर्शाते हैं।

इंस्टालेशन के बाद डायरेक्टरी संरचना

पहले hello world प्रोग्राम को समझने के बाद, आइए नीचे जाएं और देखें कि OpenResty की डायरेक्टरी संरचना इंस्टालेशन के बाद कैसी दिखती है और इसमें कौन सी फाइलें शामिल हैं।

हम पहले -V विकल्प का उपयोग करके देखते हैं कि OpenResty कहां है। निम्नलिखित परिणाम के लिए, मैंने कई मॉड्यूल कंपाइलेशन पैरामीटर्स को छोड़ दिया है, जिन्हें हम बाद में जोड़ेंगे:

$ openresty -V nginx version: openresty/1.13.6.2 built by clang 10.0.0 (clang-1000.10.44.4) built with OpenSSL 1.1.0h 27 Mar 2018 TLS SNI support enabled configure arguments: --prefix=/usr/local/Cellar/openresty/1.13.6.2/nginx ...

मैं अपने Mac पर OpenResty को इंस्टॉल करने के लिए brew का उपयोग करता हूं। पथ /usr/local/Cellar/openresty/1.13.6.2/nginx है, जो आपके वातावरण से भिन्न हो सकता है। इस पथ में bin, luajit, lualib, nginx, pod और अन्य डायरेक्टरीज़ शामिल हैं। इन फ़ोल्डरों के अर्थ को समझना आवश्यक है ताकि हम OpenResty को बेहतर ढंग से सीख सकें। तो आइए उन्हें एक-एक करके देखें।

पहले महत्वपूर्ण bin डायरेक्टरी है।

$ ll /usr/local/Cellar/openresty/1.13.6.2/bin total 320 -r-xr-xr-x 1 ming admin 19K 3 27 12:54 md2pod.pl -r-xr-xr-x 1 ming admin 15K 3 27 12:54 nginx-xml2pod lrwxr-xr-x 1 ming admin 19B 3 27 12:54 openresty -> ../nginx/sbin/nginx -r-xr-xr-x 1 ming admin 62K 3 27 12:54 opm -r-xr-xr-x 1 ming admin 29K 3 27 12:54 resty -r-xr-xr-x 1 ming admin 15K 3 27 12:54 restydoc -r-xr-xr-x 1 ming admin 8.3K 3 27 12:54 restydoc-index

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

इनमें से, opm एक पैकेज मैनेजमेंट टूल है जो हमें विभिन्न प्रकार के थर्ड-पार्टी पैकेजों को प्रबंधित करने की अनुमति देता है, जिसे हम बाद में एक सेक्शन में कवर करेंगे; और restydoc, पहले सेक्शन से एक पुराना दोस्त, OpenResty द्वारा प्रदान किया गया एक डॉक्यूमेंटेशन व्यूअर है, जो हमें OpenResty और NGINX डॉक्यूमेंटेशन देखने की अनुमति देता है।

$ restydoc -s ngx.say $ restydoc -s proxy_pass

उपरोक्त दो उदाहरण OpenResty API और NGINX कमांड्स को क्रमशः क्वेरी करते हैं। restydoc एक टूल है जो सर्वर-साइड इंजीनियर्स के लिए विकास पर ध्यान केंद्रित करने में बहुत मददगार है।

bin डायरेक्टरी को ब्राउज़ करने के बाद, आइए pod डायरेक्टरी पर चलते हैं।

सबसे पहले, हम इस बात पर जोर दें कि यहां pod का Kubernetes में पॉड की अवधारणा से कोई संबंध नहीं है। इसके बजाय, pod Perl मॉड्यूल के लिए डॉक्यूमेंटेशन लिखने के लिए Perl में उपयोग की जाने वाली एक मार्कअप भाषा है। और इस डायरेक्टरी में OpenResty, NGINX, lua-resty-*, और LuaJIT के लिए डॉक्यूमेंटेशन शामिल है, जो सभी पहले उल्लिखित restydoc के साथ जुड़े हुए हैं।

अगले परिचित NGINX और luajit डायरेक्टरीज़ हैं। ये दोनों समझने में आसान हैं। ये मुख्य रूप से NGINX और LuaJIT एक्ज़ीक्यूटेबल फाइलों और डिपेंडेंसीज़ को स्टोर करते हैं और OpenResty की नींव हैं। कई लोग कहते हैं कि OpenResty Lua पर आधारित है, लेकिन यह सटीक नहीं है। जैसा कि हम ऊपर देख सकते हैं, OpenResty वास्तव में LuaJIT पर आधारित है।

वास्तव में, शुरुआती चरण में, OpenResty Lua और LuaJIT दोनों के साथ आता था, और हम कंपाइलेशन विकल्पों द्वारा Lua या LuaJIT का उपयोग करने का निर्णय ले सकते थे, लेकिन Lua को डिप्रेकेट किया जा रहा है, और केवल उच्च-प्रदर्शन LuaJIT का समर्थन किया जाता है।

अंत में, आइए lualib डायरेक्टरी को देखें। इसमें OpenResty में उपयोग की जाने वाली Lua लाइब्रेरीज़ शामिल हैं, जो मुख्य रूप से दो डायरेक्टरीज़ में विभाजित हैं: ngx और resty

  • ngx डायरेक्टरी में आधिकारिक lua-resty-core प्रोजेक्ट से Lua कोड्स होते हैं, जो OpenResty API के FFI पुनः कार्यान्वयन पर आधारित हैं। मैं एक विशेष अध्याय में समझाऊंगा कि हमें इसे पुनः कार्यान्वित करने की आवश्यकता क्यों है।
  • resty डायरेक्टरी में विभिन्न lua-resty-* प्रोजेक्ट्स से Lua कोड्स होते हैं, जिन्हें हम अगले में छूएंगे।

इस कोर्स की परंपरा के अनुसार, इस बिंदु पर मैं इन डायरेक्टरीज़ के स्रोत का स्रोत दूंगा। यह ओपन सोर्स प्रोजेक्ट्स के आनंद में से एक है। यदि आपको तोड़ने और अंत तक पूछने का शौक है, तो आप हमेशा और रोचक चीजें पाएंगे।

यहां CentOS के लिए OpenResty का पैकेजिंग स्क्रिप्ट है, जिसमें उपरोक्त सभी डायरेक्टरीज़ शामिल हैं।

%files %defattr(-,root,root,-) /etc/init.d/%{name} /usr/bin/%{name} %{orprefix}/bin/openresty %{orprefix}/site/lualib/ %{orprefix}/luajit/* %{orprefix}/lualib/* %{orprefix}/nginx/html/* %{orprefix}/nginx/logs/ %{orprefix}/nginx/sbin/* %{orprefix}/nginx/tapset/* %config(noreplace) %{orprefix}/nginx/conf/* %{orprefix}/COPYRIGHT

OpenResty प्रोजेक्ट अवलोकन

जब OpenResty की बात आती है, तो हम lua-nginx-module के बारे में सोचते हैं। हां, यह NGINX C मॉड्यूल वास्तव में OpenResty का कोर है, लेकिन यह OpenResty के बराबर नहीं है। कई इंजीनियर्स OpenResty को ngx + lua कहते हैं, जो कई तकनीकी सम्मेलनों द्वारा साझा और प्रकाशित पुस्तकों में भी उपयोग किया जाता है। यह सख्त नहीं है और OpenResty समुदाय द्वारा समर्थित नहीं है।

मैं बताऊंगा कि क्यों और lua-nginx-module के अलावा OpenResty में अन्य संबंधित प्रोजेक्ट्स क्या हैं।

GitHub पर OpenResty के प्रोजेक्ट होमपेज को खोलें, और आप देख सकते हैं कि OpenResty में 68 सार्वजनिक प्रोजेक्ट्स शामिल हैं, जो मोटे तौर पर निम्नलिखित सात श्रेणियों में विभाजित हैं। मैं उन्हें अलग-अलग संक्षेप में परिचय दूंगा ताकि आपको एक प्रारंभिक छाप मिल सके और इसे जल्दी सीख सकें।

NGINX C मॉड्यूल्स

OpenResty के प्रोजेक्ट नामकरण मानकीकृत हैं, और जिन्हें *-nginx-module नाम दिया गया है, वे NGINX C मॉड्यूल हैं।

OpenResty में 20 से अधिक C मॉड्यूल हैं, और हम उन्हें openresty -V का उपयोग करके ढूंढ सकते हैं, जिसका हमने इस सेक्शन की शुरुआत में उपयोग किया था।

$ openresty -V nginx version: openresty/1.13.6.2 built by clang 10.0.0 (clang-1000.10.44.4) built with OpenSSL 1.1.0h 27 Mar 2018 TLS SNI support enabled configure arguments: --prefix=/usr/local/Cellar/openresty/1.13.6.2/nginx --with-cc-opt='-O2 -I/usr/local/include -I/usr/local/opt/pcre/include -I/usr/local/opt/openresty-openssl/include' --add-module=../ngx_devel_kit-0.3.0 --add-module=../echo-nginx-module-0.61 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2rc3 --add-module=../set-misc-nginx-module-0.32 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.08 --add-module=../srcache-nginx-module-0.31 --add-module=../ngx_lua-0.10.13 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.33 --add-module=../array-var-nginx-module-0.05 --add-module=../memc-nginx-module-0.19 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.7 --add-module=../ngx_stream_lua-0.0.5 --with-ld-opt='-Wl,-rpath,/usr/local/Cellar/openresty/1.13.6.2/luajit/lib -L/usr/local/lib -L/usr/local/opt/pcre/lib -L/usr/local/opt/openresty-openssl/lib' --pid-path=/usr/local/var/run/openresty.pid --lock-path=/usr/local/var/run/openresty.lock --conf-path=/usr/local/etc/openresty/nginx.conf --http-log-path=/usr/local/var/log/nginx/access.log --error-log-path=/usr/local/var/log/nginx/error.log --with-pcre-jit --with-ipv6 --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_v2_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module --with-http_realip_module --with-http_addition_module --with-http_auth_request_module --with-http_secure_link_module --with-http_random_index_module --with-http_geoip_module --with-http_gzip_static_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-threads --with-dtrace-probes --with-stream --with-stream_ssl_module --with-http_ssl_module

यहां --add-module= के बाद OpenResty के C मॉड्यूल हैं। कोर वाले हैं lua-nginx-module और stream-lua-nginx-module, पहले वाला Layer 7 ट्रैफ़िक को हैंडल करने के लिए और दूसरा Layer 4 ट्रैफ़िक को ड्राइव करने के लिए।

इनमें से कुछ C मॉड्यूल्स पर विशेष ध्यान देने की आवश्यकता है और अनुशंसित नहीं हैं, हालांकि वे डिफ़ॉल्ट रूप से OpenResty में कंपाइल होते हैं। उदाहरण के लिए, redis2-nginx-module, redis-nginx-module, और memc-nginx-module Redis और Memcached के साथ इंटरऑपरेट करने के लिए उपयोग किए जाते हैं। ये C लाइब्रेरीज़ OpenResty द्वारा शुरुआती चरण में अनुशंसित थीं, लेकिन cosocket फीचर जोड़ने के बाद lua-resty-redis और lua-resty-memcached द्वारा प्रतिस्थापित कर दी गई हैं, और निष्क्रिय रूप से बनाए रखी जाती हैं।

OpenResty बाद में अधिक NGINX C लाइब्रेरीज़ विकसित नहीं करेगा, लेकिन cosocket-based Lua लाइब्रेरी पर ध्यान केंद्रित करेगा, जो भविष्य है।

lua-resty-* लाइब्रेरीज़

आधिकारिक OpenResty रिपॉजिटरी में 18 lua-resty-* लाइब्रेरीज़ शामिल हैं, जिनमें Redis, MySQL, Memcached, WebSocket, DNS, ट्रैफ़िक कंट्रोल, स्ट्रिंग प्रोसेसिंग, इन-प्रोसेस कैशिंग, और अन्य स्टैंडर्ड लाइब्रेरीज़ शामिल हैं। आधिकारिक लोगों के अलावा, और भी थर्ड-पार्टी लाइब्रेरीज़ हैं। वे आवश्यक हैं, और हम अगले सेक्शन में इन लाइब्रेरीज़ पर अधिक समय देंगे।

स्व-प्रबंधित LuaJIT शाखा

OpenResty अपने स्वयं के OpenSSL पैच के अलावा अपनी LuaJIT शाखा को भी प्रबंधित करता है। 2015 में, LuaJIT के लेखक Mike Pall ने एक नए LuaJIT प्रबंधक की तलाश में अपनी सेवानिवृत्ति की घोषणा की, लेकिन Mike को एक उपयुक्त प्रबंधक नहीं मिला। वह अब मुख्य रूप से बगफिक्स रखरखाव कर रहे हैं, और नई सुविधाओं का विकास निलंबित कर दिया गया है, इसलिए OpenResty अपनी LuaJIT शाखा को प्रबंधित करता है।

Lua की तुलना में, LuaJIT बहुत सारी आवश्यक और अद्वितीय सुविधाएँ जोड़ता है, लेकिन बहुत से इंजीनियर्स उनके बारे में नहीं जानते हैं, इसलिए वे अर्ध-छिपे हुए कौशल हैं जिन्हें मैं बाद में परिचय दूंगा।

टेस्टिंग फ्रेमवर्क

OpenResty का टेस्टिंग फ्रेमवर्क test-nginx है, जो Perl में भी विकसित किया गया है, और जैसा कि नाम से पता चलता है, यह विशेष रूप से NGINX-संबंधित प्रोजेक्ट्स को टेस्ट करने के लिए डिज़ाइन किया गया है। OpenResty के सभी आधिकारिक टेस्ट केस C मॉड्यूल और lua-resty लाइब्रेरी के लिए test-nginx द्वारा संचालित हैं। यह एक बहुत अधिक शक्तिशाली और स्वतंत्र प्रणाली है, जो सामान्य असेर्शन-आधारित फ्रेमवर्क्स से अलग है।

कुछ OpenResty योगदानकर्ताओं ने भी इस टेस्टिंग फ्रेमवर्क को समझा नहीं है और कभी-कभी PRs सबमिट करते हैं जिनमें जटिल C और Lua कोड होते हैं लेकिन फिर भी संबंधित टेस्ट केस लिखने के विचार से डरते हैं। इसलिए यदि आपने OpenResty प्रोजेक्ट के /t डायरेक्टरी में कुछ टेस्ट केस देखे हैं और अभी भी भ्रमित हैं, तो अभी तक खुद पर संदेह न करें। अधिकांश लोग समान हैं।

test-nginx के अलावा, mockeagain प्रोजेक्ट एक धीमे नेटवर्क का अनुकरण करता है, जो प्रोग्राम को एक बार में एक बाइट पढ़ने और लिखने की अनुमति देता है। यह वेब सर्वर के लिए एक बहुत उपयोगी टूल है।

डीबग टूलचेन

OpenResty प्रोजेक्ट ने कोड को वैज्ञानिक और गतिशील रूप से डीबग करने के तरीके पर बहुत प्रयास किया है।

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

उदाहरण के लिए, एक systemtap अस्पताल जाने और CT स्कैन कराने जैसा है, दर्द रहित और अप्रत्यक्ष। इससे भी बेहतर, systemtap प्रदर्शन विश्लेषण के लिए दृश्य फ्लेम ग्राफ उत्पन्न कर सकता है, जिसे मैं बाद में वर्णन करूंगा, इसलिए यहां एक फ्लेम ग्राफ है जो आपको एक अंदाज़ देगा।

OpenResty संबंधित फ्लेम ग्राफ

पैकेज

विभिन्न वितरण ऑपरेटिंग सिस्टम (जैसे CentOS, Ubuntu, macOS, आदि) में OpenResty के पैकेजिंग स्क्रिप्ट्स को अधिक संतोषजनक नियंत्रण के लिए हाथ से लिखा गया है। जब हमने इंस्टालेशन के बाद डायरेक्टरी संरचना का परिचय दिया, तो हमने पहले ही इन पैकेजिंग-संबंधित प्रोजेक्ट्स को कवर कर लिया है: openresty-packaging और home-brew। यदि आप इसमें रुचि रखते हैं, तो आप इसे स्वयं सीख सकते हैं, और मैं यहां इसे दोहराऊंगा नहीं।

इंजीनियरिंग टूल्स

इन बड़े प्रोजेक्ट्स के अलावा, OpenResty के पास कई इंजीनियरिंग टूल्स हैं जो ज्यादातर छिपे हुए हैं।

उदाहरण के लिए, openresty-devel-utils OpenResty और NGINX के लिए डेवलपमेंट टूलसेट है। बेशक, वे Perl में भी विकसित किए गए हैं, और अधिकांश टूल्स अप्रलेखित हैं। लेकिन OpenResty डेवलपर्स के लिए, ये टूल्स बहुत उपयोगी हैं। मैं कुछ को चुनकर संक्षेप में परिचय दूंगा।

  • lj-releng एक सरल और प्रभावी LuaJIT कोड इंस्पेक्शन टूल है, जो luacheck के समान है, जो ग्लोबल वेरिएबल्स के साथ संभावित समस्याओं को ढूंढ सकता है।
  • reindex, जिसका अर्थ है इंडेक्स को पुनः बनाना, test-nginx टेस्ट केस को फॉर्मेट करने, टेस्ट केस नंबरों को पुनर्व्यवस्थित करने, और अतिरिक्त व्हाइटस्पेस को हटाने के लिए एक टूल है। reindex OpenResty डेवलपर्स द्वारा प्रतिदिन उपयोग किए जाने वाले टूल्स में से एक है।
  • opsboy स्वचालित डिप्लॉयमेंट करने के लिए उपयोग किया जाता है। यह OpenResty द्वारा प्रत्येक रिलीज़ से पहले AWS EC2 क्लस्टर पर किए जाने वाले रिग्रेशन टेस्ट को डिप्लॉय और ड्राइव करने के लिए उपयोग किया जाता है। विस्तृत जानकारी के लिए, आप आधिकारिक दस्तावेज़ीकरण देख सकते हैं। opsboy Perl में लागू एक DSL है। OpenResty लेखक समस्याओं को हल करने के लिए विभिन्न DSLs बनाना पसंद करते हैं।

सारांश

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

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