---
title: "आपका पहला OpenResty प्रोग्राम: Hello World - API7.ai"
description: "इस पोस्ट को फॉलो करके OpenResty में Hello World को इम्प्लीमेंट करें!"
url: "https://api7.ai/hi/learning-center/openresty/hello-world-in-openresty"
---

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

API7.ai

September 9, 2022

[OpenResty (NGINX + Lua)](https://api7.ai/learning-center/openresty)

जब हम एक नई डेवलपमेंट भाषा सीखना शुरू करते हैं, तो ट्यूटोरियल्स एक सरल `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 में क्या अंतर है](https://api7.ai/learning-center/openresty/openresty-vs-nginx/) पोस्ट में कहा था, OpenResty `NGINX` पर आधारित है। तो आपके मन में एक सवाल हो सकता है: यहां हमें NGINX की छाया क्यों नहीं दिख रही है? चिंता न करें, आइए एक लाइन कोड जोड़कर देखें कि resty के पीछे क्या चल रहा है:

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

हमने [ngx.sleep](https://github.com/openresty/lua-nginx-module#ngxsleep) मेथड जोड़ा है ताकि प्रोग्राम स्ट्रिंग `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 इंस्टॉल करें। अधिक विस्तृत चरणों के लिए, आप [आधिकारिक दस्तावेज़](https://openresty.org/en/linux-packages.html) का संदर्भ ले सकते हैं।

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

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

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

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

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

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

आइए विषय पर वापस आते हैं। OpenResty सोर्स कोड से इंस्टॉल करने के लिए, न केवल चरण जटिल हैं, आपको `PCRE`, `OpenSSL` जैसे बाहरी निर्भरताओं को हल करने की आवश्यकता है, बल्कि आपको संबंधित OpenSSL संस्करण को मैन्युअल रूप से पैच करने की भी आवश्यकता है। अन्यथा, `SSL sessions` को संभालते समय कार्यक्षमता की कमी होगी। उदाहरण के लिए, [ngx.sleep](https://github.com/openresty/lua-nginx-module#ngxsleep) जैसे Lua APIs जो `yield` का कारण बनते हैं, का उपयोग नहीं किया जा सकता है। यदि आप इस भाग के बारे में अधिक जानना चाहते हैं, तो आप [आधिकारिक दस्तावेज़](https://github.com/openresty/lua-nginx-module#ssl_session_fetch_by_lua_block) का संदर्भ ले सकते हैं।

OpenResty उन पैचों को [OpenSSL पैकेज स्क्रिप्ट](https://github.com/openresty/openresty-packaging/blob/master/rpm/SPECS/openresty-openssl.spec) में स्वयं बनाए रख रहा है। जब 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 की [पैकेज स्क्रिप्ट](https://github.com/openresty/openresty-packaging/blob/master/rpm/SPECS/openresty.spec) को देख सकते हैं कि क्या अन्य छिपे हुए बिंदु हैं:

```
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` का उपयोग कर सकते हैं या [आधिकारिक दस्तावेज़](https://github.com/openresty/resty-cli) को पढ़ सकते हैं। आगे, मैं दो रोचक सुविधाओं का परिचय दूंगा।

```
$ 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](https://github.com/openresty/lua-nginx-module#ngxsay) मेथड को एम्बेड करता है।

```
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।

Share article link

Share

Related Posts

[![OpenResty FAQ | OpenResty का व्यवहारिक उपयोग कैसे किया जाता है](https://static.api7.ai/uploads/2023/02/12/jbv9M0zi_Hello%20World%20in%20OpenResty%20%283%29.png)](https://api7.ai/learning-center/openresty/faq-5)

## [OpenResty FAQ | OpenResty का व्यवहारिक उपयोग कैसे किया जाता है](https://api7.ai/learning-center/openresty/faq-5)

[![भाग 3: OpenResty का उपयोग करके एक Microservices API Gateway कैसे बनाएं](https://static.api7.ai/uploads/2023/02/07/3XJXY9Jy_45.png)](https://api7.ai/learning-center/openresty/how-to-build-a-microservices-api-gateway-part-3)

## [भाग 3: OpenResty का उपयोग करके एक Microservices API Gateway कैसे बनाएं](https://api7.ai/learning-center/openresty/how-to-build-a-microservices-api-gateway-part-3)

Table of Contents

- [इंस्टॉलेशन](#%E0%A4%87%E0%A4%82%E0%A4%B8%E0%A5%8D%E0%A4%9F%E0%A5%89%E0%A4%B2%E0%A5%87%E0%A4%B6%E0%A4%A8)
- [OpenResty CLI](#openresty-cli)
- [अधिक औपचारिक "hello world"](#%E0%A4%85%E0%A4%A7%E0%A4%BF%E0%A4%95-%E0%A4%94%E0%A4%AA%E0%A4%9A%E0%A4%BE%E0%A4%B0%E0%A4%BF%E0%A4%95-hello-world)
- [सारांश](#%E0%A4%B8%E0%A4%BE%E0%A4%B0%E0%A4%BE%E0%A4%82%E0%A4%B6)
