OpenResty FAQ | OpenResty का व्यवहारिक उपयोग कैसे किया जाता है

API7.ai

February 10, 2023

OpenResty (NGINX + Lua)

  1. OpenResty, API गेटवे, और Lua के बारे में कुछ प्रश्न और उत्तर
  2. OpenResty FAQ | विशेषाधिकार प्रक्रिया अनुमति, निष्पादन चरण, और अधिक
  3. OpenResty FAQ | परीक्षण के लिए नेटवर्क संरचना, SSL-संबंधित सुविधाएँ, DSL, ab टूल
  4. OpenResty FAQ | डायनामिक लोड, NYI, और शेयर्ड डिक्ट का कैशिंग

अब तक, हमने OpenResty, माइक्रोसर्विसेज API गेटवे का अंतिम भाग पूरा कर लिया है। बधाई हो कि आप पीछे नहीं रहे, सक्रिय रूप से सीख रहे हैं और अभ्यास कर रहे हैं, और उत्साहपूर्वक अपने विचार साझा कर रहे हैं।

मैंने यहां कुछ विशिष्ट और रोचक प्रश्नों का चयन किया है ताकि उन्हें आपके साथ साझा कर सकूं। आइए आज इन 5 प्रश्नों पर नजर डालें।

प्रश्न 1: OpenResty का व्यवहारिक उपयोग कैसे किया जाता है

विवरण: कोर्स लगभग समाप्त हो चुका है, और मैं इसे मूल रूप से समझ सकता हूं, लेकिन मेरा अपना अभ्यास अभी भी कम है (वर्तमान में मेरे काम में इसका उपयोग नहीं किया जाता है)। क्योंकि मैं इसे अपने काम में उपयोग नहीं कर सकता। हालांकि, यह एक बहुत ही उपयोगी लेख श्रृंखला है। लेखक को साझा करने के लिए धन्यवाद, और मैं इसे बाद में अपने काम में पेश करूंगा।

मैं काम में OpenResty को पेश करने के बारे में बात करना चाहूंगा, यह एक चर्चा के योग्य विषय है।

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

पहला, सुनिश्चित करें कि ऑनलाइन NGINX संस्करण OpenResty के मुख्य संस्करण के समान है, जैसे OpenResty 1.15.8.1, जो NGINX 1.15.8 का उपयोग करता है। यदि वर्तमान ऑनलाइन NGINX संस्करण OpenResty के नवीनतम संस्करण से अधिक है, तो आपको OpenResty पर स्विच करने में सावधानी बरतनी चाहिए। आखिरकार, OpenResty अभी भी अपग्रेड करने में धीमा है और NGINX के मुख्य संस्करण से छह महीने से एक साल पीछे है। यदि ऑनलाइन NGINX संस्करण OpenResty के समान या उससे कम है, तो आपके पास अपग्रेड करने के लिए पूर्वापेक्षाएं हैं।

दूसरा, परीक्षण। परीक्षण सबसे महत्वपूर्ण पहलुओं में से एक है। OpenResty का उपयोग करके NGINX को प्रतिस्थापित करने में कम जोखिम होता है, लेकिन जोखिम अभी भी मौजूद हैं। उदाहरण के लिए, क्या कोई कस्टम C मॉड्यूल हैं जिन्हें संकलित करने की आवश्यकता है, OpenResty द्वारा उपयोग किए जाने वाले openssl का संस्करण, और OpenResty द्वारा NGINX पर लगाए गए पैच का व्यवसाय पर प्रभाव पड़ेगा या नहीं। आपको इसकी पुष्टि करने के लिए कुछ व्यावसायिक ट्रैफ़िक को दोहराने की आवश्यकता है।

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

NGINX को प्रतिस्थापित करने के अलावा, OpenResty के दो अन्य आसान प्रवेश बिंदु हैं: WAF और API गेटवे। ये दोनों ऐसे परिदृश्य हैं जिनमें उच्च प्रदर्शन और गतिशील आवश्यकताएं होती हैं और इनके लिए संबंधित ओपन-सोर्स प्रोजेक्ट्स हैं जिन्हें तुरंत उपयोग किया जा सकता है, जिनके बारे में मैंने पहले भाग में बताया था।

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

आम तौर पर, NGINX को प्रतिस्थापित करके शुरू करना और फिर धीरे-धीरे OpenResty का उपयोग करना एक अच्छा विचार है।

प्रश्न 2: OpenResty के लिए डेटाबेस एनकैप्सुलेशन

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

आप पहले SystemTap या अन्य टूल्स के साथ इसका विश्लेषण कर सकते हैं जिन्हें हमने पिछले लेखों में पेश किया था, यह देखने के लिए कि क्या SQL स्टेटमेंट्स का संयोजन सिस्टम का बॉटलनेक है। यदि यह नहीं है, तो इसे अनुकूलित करने की आवश्यकता नहीं है। आखिरकार, समय से पहले अनुकूलन सभी बुराइयों की जड़ है।

यदि बॉटलनेक वास्तव में SQL स्टेटमेंट्स का संयोजन है, तो हम डेटाबेस prepare स्टेटमेंट का उपयोग करके अनुकूलन कर सकते हैं या एक सरणी का उपयोग करके संयोजन कर सकते हैं। लेकिन lua-resty-mysql का prepare के लिए समर्थन TODO स्थिति में है, इसलिए हम केवल सरणी संयोजन का उपयोग कर सकते हैं। यह कुछ lua-resty लाइब्रेरीज की एक सामान्य समस्या है, जो अधिकांश कार्यक्षमता को लागू करती हैं और सामान्य रूप से चलती हैं लेकिन समय पर अपडेट नहीं होती हैं। डेटाबेस prepare स्टेटमेंट के अलावा, lua-resty-redis का cluster के लिए कोई समर्थन नहीं है।

स्ट्रिंग संयोजन और lua-resty लाइब्रेरीज उन समस्याओं की तरह हैं जिन्हें OpenResty DSL के साथ पूरी तरह से हल करना चाहता है - कंपाइलर तकनीक का उपयोग करके स्वचालित रूप से सरणी उत्पन्न करना ताकि स्ट्रिंग्स को संयोजित किया जा सके, इन विवरणों को ऊपरी स्तर के उपयोगकर्ताओं से छिपाया जा सके; DSL wirelang का उपयोग करके विभिन्न lua-resty नेटवर्क संचार लाइब्रेरीज को स्वचालित रूप से उत्पन्न करना, हाथ से लिखने की आवश्यकता को समाप्त करना।

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

प्रश्न 3: OpenResty वेब फ्रेमवर्क

विवरण: मैं OpenResty के साथ एक वेब प्रोजेक्ट बनाना चाहता हूं, लेकिन यह मुख्य रूप से दर्दनाक है क्योंकि मुझे एक परिपक्व फ्रेमवर्क नहीं मिल रहा है, और मुझे बहुत सारे पहिये बनाने की आवश्यकता है। उदाहरण के लिए, डेटाबेस ऑपरेशन समस्या। मुझे कोई ऐसी क्लास लाइब्रेरी नहीं मिली जो डायनामिक रूप से SQL स्टेटमेंट्स बना सके और सुसंगत ऑपरेशन कर सके। इसलिए मैं लेखक से पूछना चाहूंगा, क्या आप एक अच्छा वेब फ्रेमवर्क सुझा सकते हैं?

awesome-resty रिपॉजिटरी में, हम देख सकते हैं कि वेब फ्रेमवर्क के लिए एक विशेष श्रेणी है, जिसमें 20 ओपन-सोर्स प्रोजेक्ट्स हैं, लेकिन उनमें से अधिकांश स्थिर हैं। उनमें से, Lapis, lor और vanilla तीन प्रोजेक्ट्स हैं जिन्हें आप आज़मा सकते हैं और देख सकते हैं कि कौन सा अधिक उपयुक्त है।

वास्तव में, एक मजबूत वेब फ्रेमवर्क के बिना, OpenResty बड़े प्रोजेक्ट्स को संभालने में अभिभूत हो जाता है, यही कारण है कि कम लोग OpenResty का उपयोग व्यावसायिक प्रणालियों के लिए करते हैं।

प्रश्न 4: प्रतिक्रिया शरीर को संशोधित करने के बाद प्रतिक्रिया हेडर में content-length कैसे बदलें?

विवरण: यदि मुझे प्रतिक्रिया शरीर की सामग्री को संशोधित करने की आवश्यकता है, तो मैं केवल बॉडी फ़िल्टर में परिवर्तन कर सकता हूं, लेकिन इससे बॉडी की लंबाई content-length लंबाई के साथ असंगत हो जाएगी। मुझे इसे कैसे संभालना चाहिए?

इस मामले में, हमें बॉडी फ़िल्टर चरण से पहले हेडर फ़िल्टर चरण में सामग्री लंबाई प्रतिक्रिया हेडर को nil पर सेट करना होगा और इसे वापस नहीं करना होगा और इसके बजाय स्ट्रीम आउटपुट करना होगा।

निम्नलिखित एक नमूना कोड है:

server { listen 8080; location /test { proxy_pass http://api7.ai; header_filter_by_lua_block { ngx.header.content_length = nil } body_filter_by_lua_block { ngx.arg[1] = ngx.arg[1] .. "abc" } } }

जैसा कि आप इस कोड से देख सकते हैं, बॉडी filter चरण में, ngx.arg[1] प्रतिक्रिया शरीर का प्रतिनिधित्व करता है। यदि हम इसके बाद स्ट्रिंग abc जोड़ते हैं, तो प्रतिक्रिया हेडर सामग्री लंबाई अशुद्ध हो जाएगी, इसलिए हम इसे हेडर फ़िल्टर चरण में अक्षम कर सकते हैं।

इसके अलावा, यह उदाहरण दिखाता है कि OpenResty के विभिन्न चरण कैसे एक साथ काम करते हैं, जिस पर मैं चाहूंगा कि आप ध्यान दें और सोचें।

प्रश्न 5: OpenResty में Lua पैकेज पाथ

विवरण: lua_package_path को Lua निर्भरताओं के लिए खोज पथ के रूप में कॉन्फ़िगर किया गया प्रतीत होता है। content_by_lua_file के लिए, मैंने प्रयोग किया और पाया कि यह केवल डायरेक्टिव द्वारा प्रदान की गई फ़ाइल के सापेक्ष पथ के आधार पर प्रीफ़िक्स के तहत खोजता है, lua_package_path के तहत नहीं। मुझे नहीं पता कि मेरी समझ सही है या नहीं।

lua_package_path का उपयोग Lua मॉड्यूल्स को लोड करने के लिए किया जाता है, उदाहरण के लिए, जब हम require 'cjson' कहते हैं, तो हम lua_package_path में निर्दिष्ट निर्देशिका में जाएंगे और cjson मॉड्यूल की तलाश करेंगे। इसके विपरीत, content_by_lua_file के बाद डिस्क पर एक फ़ाइल पथ होता है।

location /test { content_by_lua_file /path/test.lua; }

यदि यह एक पूर्ण पथ नहीं है बल्कि एक सापेक्ष पथ है।

content_by_lua_file path/test.lua;

तब OpenResty स्टार्टअप पर निर्दिष्ट -p निर्देशिका का उपयोग करके पूर्ण पथ प्राप्त करने के लिए एक संयोजन किया जाएगा।

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