यदि Lua rules और NGINX configuration के बीच conflict हो तो क्या होगा?
API7.ai
October 13, 2022
1. OpenResty का नाम और भाषा
प्रश्न: मैंने अभी तक OpenResty नाम की उत्पत्ति को समझा नहीं है। साथ ही, OpenResty Lua भाषा के साथ उड़ान भरता है, तो अन्य स्क्रिप्टिंग भाषाओं के साथ क्यों नहीं? उदाहरण के लिए, Shell, आदि।
उत्तर: OpenResty Yahoo! के एक कॉर्पोरेट प्रोजेक्ट के रूप में शुरू हुआ, जो अक्टूबर 2007 में शुरू हुआ। "Open" नाम OpenAPI से लिया गया था, और "Resty" rest API से लिया गया था। शुरुआत में, OpenResty को एक वेब सर्वर और डेवलपमेंट प्लेटफॉर्म के रूप में नहीं बल्कि एक वेबसाइट जैसे एप्लिकेशन के रूप में बनाने का इरादा था।
जब OpenResty को एक दशक पहले ओपन-सोर्स किया गया था, तो बहुत कम भाषाएं सिंक्रोनस नॉन-ब्लॉकिंग का समर्थन करती थीं। अब भी, बहुत कम बैक-एंड भाषाएं OpenResty के साथ इस स्तर के प्रदर्शन को प्राप्त कर सकती हैं। वर्तमान में, अधिक डेवलपर्स API गेटवे और सॉफ्ट WAF में OpenResty का उपयोग कर रहे हैं, जो डेवलपर्स के लिए एक स्वाभाविक विकल्प है।
भाषा के संबंध में, OpenResty एकमात्र प्रोजेक्ट नहीं है जो अन्य डेवलपमेंट भाषाओं को NGINX में एम्बेड करता है। उदाहरण के लिए, NGINX आधिकारिक तौर पर JS को एम्बेड करता है; ऐसे ओपन सोर्स प्रोजेक्ट्स भी हैं जो PHP को NGINX में एम्बेड करते हैं।
आमतौर पर, भाषा का चयन कंकरेंसी, JIT, और भाषा की लोकप्रियता जैसे कारकों पर आधारित होता है। OpenResty के लिए, 2007 में Lua वास्तव में सबसे अच्छा विकल्प था। OpenResty ने अपने शुरुआती संस्करणों में Lua के बजाय perl को चुनकर एक चक्कर लगाया।
2. कॉन्फ़िगरेशन की प्राथमिकता
प्रश्न: जब OpenResty में Lua नियम NGINX कॉन्फ़िगरेशन फ़ाइल के साथ टकराते हैं, उदाहरण के लिए, NGINX ने rewrite नियम कॉन्फ़िगर किए हैं, और साथ ही rewrite_by_lua_file का संदर्भ दिया गया है, तो इन दोनों नियमों की प्राथमिकता क्या है?
उत्तर: वास्तव में, यह इस पर निर्भर करता है कि NGINX कॉन्फ़िगरेशन rewrite नियम कैसे लिखा गया है, चाहे वह break हो या last, जो OpenResty के आधिकारिक दस्तावेज़ में बताया गया है, एक नमूना कोड के साथ:
location /foo { rewrite ^ /bar; rewrite_by_lua 'ngx.exit(503)'; } location /bar { ... }
इस नमूना कोड की कॉन्फ़िगरेशन में, ngx.exit(503) निष्पादित नहीं होगा।
हालांकि, यदि आप इसे निम्नलिखित तरीके से लिखते हैं, तो ngx.exit(503) निष्पादित होगा।
rewrite ^ /bar break.
हालांकि, मैं NGINX कॉन्फ़िगरेशन के बजाय OpenResty का उपयोग rewrite के लिए करने की सलाह देता हूं। इस अस्पष्टता से बचने के लिए, बहुत सारे NGINX कॉन्फ़िगरेशन अपेक्षाकृत अस्पष्ट होते हैं और आपको इसे समझने के लिए दस्तावेज़ीकरण को बार-बार देखने की आवश्यकता होती है।
3. मेरा कोड त्रुटि क्यों देता है?
प्रश्न: LuaJIT एक्सटेंशन की टेबल फ़ंक्शन में, निम्नलिखित दो लाइनों का कोड LuaJIT द्वारा निष्पादित होने पर "मॉड्यूल नहीं मिला" त्रुटि क्यों देता है? मैं LuaJIT संस्करण 2.0.5 का उपयोग कर रहा हूं।
local new_tab = require('table.new') # या require('table.clear') # निष्पादन त्रुटि देगा luajit: table_luajit.lua:1: module 'table.new' not found:
उत्तर: इन दो लाइनों के कोड को चलाने के लिए LuaJIT संस्करण 2.1 की आवश्यकता होती है, जो यहां दस्तावेज़ित है: https://github.com/LuaJIT/LuaJIT/blob/v2.1/doc/extensions.html#L218, आप इसे यहां पा सकते हैं।
जैसा कि हमने उल्लेख किया है, OpenResty का उपयोग करते समय आपको विशेष ध्यान देने की आवश्यकता है, जिसे सही ढंग से चलाने के लिए LuaJIT के एक विशिष्ट संस्करण की आवश्यकता होती है। OpenResty LuaJIT 2.1 शाखा पर आधारित है और इसने LuaJIT के लिए बहुत सारे एक्सटेंशन बनाए हैं।
इसलिए, इस कॉलम में कोड चलाते समय, कृपया आधिकारिक OpenResty इंस्टालेशन का उपयोग करना याद रखें। यदि आप NGINX के ऊपर lua-nginx-module को जोड़कर कंपाइल करते हैं, तो आप अभी भी कई समस्याओं में फंस सकते हैं!
4. नल मानों के बारे में भ्रम
प्रश्न: मैंने कुछ भ्रमित करने वाली चीजें देखी हैं जैसे ngx.null, nil, null, और ""। जब मैंने वेब पर खोज की, तो मैंने देखा कि किसी ने कहा कि null ngx.null की परिभाषा है। जब Redis वापसी करता है, तो अक्सर यह निर्धारित किया जाता है कि वापसी परिणाम null है या नहीं, तो निर्धारण करते समय इसकी तुलना किस मान से की जाती है? क्या इन मानों के उपयोग के संबंध में कोई अन्य समस्याएं हैं? मैं इन मानों को स्पष्ट रूप से नहीं समझता।
उत्तर: इससे पहले कि मैं आपके प्रश्न का उत्तर दूं, मैं सुझाव देता हूं कि आप lua-resty-redis में एक कुंजी खोजने के लिए निम्नलिखित कोड का उपयोग करें।
local res, err = red:get("dog")
यह इसलिए है क्योंकि Lua का nil टेबल के मान के रूप में उपयोग नहीं किया जा सकता है, इसलिए OpenResty ने टेबल में नल मान के रूप में ngx.null को पेश किया है।
हम निम्नलिखित कोड के साथ ngx.null और इसके प्रकार को प्रिंट कर सकते हैं।
# ngx.null प्रिंट करें $ resty -e 'print(ngx.null)' null # प्रकार प्रिंट करें $ resty -e 'print(type(ngx.null))' userdata
जैसा कि आप देख सकते हैं, ngx.null nil नहीं है, बल्कि यह userdata प्रकार का है।
इसके अलावा, OpenResty में कई नल मान हैं, जैसे cjson.null, cdata``:NULL आदि, जिन पर मैं बाद में चर्चा करूंगा।
OpenResty में केवल nil और false ही गलत मान हैं। इसलिए, जब आप if not res then जैसा कोड लिखते हैं, तो आपको सावधान रहना चाहिए, और इसे स्पष्ट if res ~= nil and res ~= false then में बदलना बेहतर है, और इस तरह के कुछ के साथ, और संबंधित टेस्ट केस कवरेज के साथ।
5. API गेटवे वास्तव में क्या है?
प्रश्न: लेख में उल्लेखित API गेटवे क्या है? और NGINX, Tomcat, Apache, और अन्य वेब सर्वर?
उत्तर: API गेटवे एक गेटवे है जिसका उपयोग सेवाओं के एकीकृत प्रबंधन के लिए किया जाता है। उदाहरण के लिए, भुगतान, उपयोगकर्ता लॉगिन, आदि, सभी API के रूप में प्रदान की जाने वाली सेवाएं हैं, और उन्हें एकीकृत सुरक्षा और प्रमाणीकरण करने के लिए एक गेटवे की आवश्यकता होती है।
API गेटवे पारंपरिक NGINX, Apache को उत्तर-दक्षिण ट्रैफ़िक से निपटने के लिए प्रतिस्थापित कर सकता है, लेकिन माइक्रोसर्विसेज वातावरण में पूर्व-पश्चिम ट्रैफ़िक से निपटने के लिए भी, यह व्यवसाय के करीब एक मिडलवेयर है, न कि अंतर्निहित वेब सर्वर।
API गेटवे के परिचय और कार्यान्वयन के बारे में अधिक जानकारी के लिए, कृपया Apache APISIX देखें; Apache APISIX OpenResty कार्यान्वयन पर आधारित है।