Node.js "सर्वर" की तुलना Nginx या Apache सर्वर से कैसे होती है?


86

मैं हाल ही में Node.js का अध्ययन कर रहा हूं और सरल Node.js आधारित सर्वरों को लिखने की कुछ सामग्री पर आया हूं। उदाहरण के लिए, निम्नलिखित।

var express = require("express"),
http = require("http"), app;

// Create our Express-powered HTTP server
// and have it listen on port 3000
app = express();
http.createServer(app).listen(3000);

// set up our routes
app.get("/hello", function (req, res) {
    res.send("Hello World!");
});

app.get("/goodbye", function (req, res) {
    res.send("Goodbye World!");
});

अब, हालांकि मुझे समझ में आ रहा है कि कोड में क्या हो रहा है, मैं शब्दावली से थोड़ा भ्रमित हूं। जब मैं टर्म सर्वर सुनता हूं, तो मैं अपाचे या नग्नेक्स जैसे सामान के बारे में सोचता हूं। मुझे उनके बारे में सोचने की आदत है कि मैं एक कंटेनर की तरह हूं जो मेरे वेब एप्लिकेशन को पकड़ सकता है। Node.js सर्वर Nginx / Apache सर्वर से कैसे भिन्न होता है? क्या यह सच नहीं है कि Node.js आधारित सर्वर (कोड) को अभी भी Nginx जैसी चीज़ के भीतर रखा जा सकता है? तो दोनों को "सर्वर" क्यों कहा जाता है?


2
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?नहीं, यह गलत है
Jaromanda X

1
तकनीकी रूप से आप अपने ऐप को चला सकते हैं और नोड को इसे प्रभावी रूप से वेबसर्वर की भूमिका को पूरा करने वाले क्लाइंट तक पहुंचा सकते हैं, लेकिन आप शायद इससे अधिक काट रहे हैं जितना आप चबाना चाहते हैं। मैंने हाल ही में इस महान लेख को विषय पर पढ़ा: nginx.com/blog/nginx-vs-apache-our-view
datafunk

1
मुझे स्पष्ट करें कि जब मैंने दोनों के बीच अंतर पूछा, तो मैं अपाचे बनाम नगनेक्स के बारे में नहीं ले रहा था। मैं Node.js बनाम Nginx के बारे में ले रहा था।
आभारी

1
शीर्षक को गलत न होने दें। यदि आप लेख पढ़ते हैं तो आप समझ जाएंगे कि मैंने ऐसा क्यों कहा कि जब आप इसे स्वयं कर सकते हैं, तो आप नहीं कर सकते ...
datafunk

जवाबों:


128

यह एक सर्वर है, हाँ।

एक नोड.जेएस वेब एप्लिकेशन एक पूर्ण-वेब वेब सर्वर है जैसे कि नग्नेक्स या अपाचे।

आप वास्तव में किसी अन्य वेब सर्वर का उपयोग किए बिना अपने नोड.जेएस एप्लिकेशन की सेवा कर सकते हैं। बस अपना कोड बदलें:

app = express();
http.createServer(app).listen(80); // serve HTTP directly

वास्तव में, कुछ प्रोजेक्ट अन्य सर्वर (अपाचे सहित) के लिए फ्रंट-एंड लोड बैलेंसर के रूप में नोड.जेएस का उपयोग करते हैं ।

ध्यान दें कि नोड.जेएस ऐसा करने के लिए केवल विकास स्टैक नहीं है। गो, जावा और स्विफ्ट में वेब डेवलपमेंट फ्रेमवर्क भी ऐसा करते हैं।

क्यों?

शुरुआत में सीजीआई था। CGI ठीक था और ठीक काम किया। अपाचे को एक अनुरोध मिलेगा, यह पता लगाएं कि url को CGI ऐप को निष्पादित करने की आवश्यकता है, उस CGI ऐप को निष्पादित करें और डेटा को पर्यावरण चर के रूप में पास करें, स्टडआउट पढ़ें और डेटा को ब्राउज़र में वापस सेवा दें।

समस्या यह है कि यह धीमी है। यह ठीक है जब सीजीआई ऐप एक छोटा स्टेटिकली संकलित सी प्रोग्राम था लेकिन छोटे स्टैटिकली कम्पाइल सी प्रोग्राम्स का एक समूह बनाए रखना मुश्किल हो गया। इसलिए लोगों ने स्क्रिप्टिंग भाषाओं में लिखना शुरू कर दिया। फिर इसे बनाए रखना कठिन हो गया और लोगों ने ऑब्जेक्ट ओरिएंटेड MVC फ्रेमवर्क विकसित करना शुरू कर दिया। अब हमें परेशानी होने लगी - हर जगह सभी वर्गों को संकलित करना होगा और उन सभी वस्तुओं को बस कुछ HTML की सेवा के लिए बनाना होगा, भले ही सेवा करने के लिए कुछ भी गतिशील न हो (क्योंकि रूपरेखा को यह पता लगाने की आवश्यकता है कि सेवा करने के लिए कुछ भी गतिशील नहीं है)।

क्या होगा अगर हमें उन सभी वस्तुओं को हर अनुरोध बनाने की आवश्यकता नहीं है?

यही लोगों ने सोचा था। और उस समस्या को हल करने की कोशिश करने से लेकर कई रणनीतियां बनीं। जल्द से जल्द एक mod_phpअपाचे की तरह सीधे वेब सर्वर में दुभाषियों को एम्बेड करना था । संकलित कक्षाओं और वस्तुओं को वैश्विक चर में संग्रहीत किया जा सकता है और इसलिए कैश किया गया है। एक अन्य रणनीति पूर्व-संकलन करना था। और फिर भी एक अन्य रणनीति थी कि एप्लिकेशन को एक नियमित सर्वर प्रक्रिया के रूप में चलाया जाए और FastCGI जैसे कस्टम प्रोटोकॉल का उपयोग करके वेब सर्वर के साथ बात की जाए।

तब कुछ डेवलपर्स ने HTTP को अपने ऐप-> सर्वर प्रोटोकॉल के रूप में उपयोग करना शुरू किया। वास्तव में, ऐप एक HTTP सर्वर भी है। इसका लाभ यह है कि आपको किसी नए, संभवतः छोटी गाड़ी, संभवतः परीक्षण किए गए प्रोटोकॉल को लागू करने की आवश्यकता नहीं है और आप वेब ब्राउज़र (या आमतौर पर, curl) का उपयोग करके सीधे अपने ऐप को डिबग कर सकते हैं । और आपको अपने ऐप का समर्थन करने के लिए एक संशोधित वेब सर्वर की आवश्यकता नहीं है, बस कोई भी वेब सर्वर जो रिवर्स प्रॉक्सी या रीडायरेक्ट कर सकता है।

Apache / Nginx का उपयोग क्यों करें?

जब आप एक नोड.जेएस ऐप नोट करते हैं, तो आप अपने स्वयं के वेब सर्वर के लेखक हैं। आपके ऐप का कोई भी संभावित बग इंटरनेट पर एक सीधा शोषक बग है। कुछ लोग (उचित रूप से) इसके साथ सहज नहीं हैं।

अपने नोड.जेएस ऐप के सामने अपाचे या नग्नेक्स की एक परत जोड़ने का मतलब है कि आपके ऐप के इंटरफ़ेस के रूप में लाइव इंटरनेट पर लड़ाई-परीक्षण, सुरक्षा-सख्त सॉफ़्टवेयर है। यह थोड़ा विलंबता (रिवर्स प्रॉक्सिंग) जोड़ता है, लेकिन अधिकांश इसे इसके लायक मानते हैं।

यह नोड के शुरुआती दिनों में मानक सलाह हुआ करता था ।js. लेकिन इन दिनों ऐसी साइटें और वेब सेवाएं भी हैं जो इंटरनेट से नोड.जेएस को सीधे उजागर करती हैं। http.Serverमॉड्यूल अब काफी अच्छी तरह से लड़ाई-परीक्षण इंटरनेट पर भरोसा किया जा रहा है।


1
मैंने ऐसे ही एसओ थ्रेड्स में पढ़ा है कि नोड के सामने एक नगीनेक्स या अपाचे की परत को रखना "इसकी गैर-अवरुद्ध प्रकृति को दूर करता है"। इस पर कोई विचार?
MrfksIV

3
@MrfksIV Nginx और Apache2 दोनों नॉनब्लॉकिंग हैं। वास्तव में वे नॉनब्लॉकिंग को नोड से पहले लागू करते हैं।
slebetman

14

NodeJs अपना स्वयं का सर्वर बनाता है। जैसा कि आप देख सकते हैं, शब्दावली काफी स्पष्ट है:

http.createServer(app).listen(3000);

एक सर्वर बनाएं और पोर्ट 3000 पर http अनुरोधों के लिए सुनें।

हमने अपने एक प्रोजेक्ट में nginx का इस्तेमाल किया, लेकिन यह कई नोडज इंस्टेंसेस के लिए एक लोडबेलर की तरह था।

कहते हैं कि आपके पास पोर्ट 3000 और 3001 पर दो नोडज इंस्टेंसेस हैं, अब भी आप nginxअपने वास्तविक httpकॉल को सुनने के लिए एक सर्वर के रूप में उपयोग कर सकते हैं port 80, और हो सकता है कि आपके अनुरोध को nodejsसर्वर या शायद किसी अन्य सर्वर पर पुनर्निर्देशित करें , जैसे एक loadbalancer। तो आप अभी भी जो कुछ भी nginxप्रदान करता है उसका उपयोग कर सकते हैं nodejs

एक अच्छा सवाल यहाँ पहले से ही पूछा गया है


1
मैं वास्तव में स्वयं नग्नेक्स पर केंद्रित नहीं हूं। मैं नोड के बीच अंतर के बारे में सोच रहा था। "सर्वर" और अन्य "सर्वर" जैसे अपाचे या नगनेक्स। मुझे समझ नहीं आया कि कैसे निहित (यानी नोड कोड) कंटेनर (यानी अपाचे) के बराबर हो सकता है ... लेकिन मुझे लगता है कि यह समझ गलत थी। अब, मुझे पता है कि नोड.जेएस कोड 3000 की तरह सुनता है जैसे कि अपाचे 80 को पोर्ट सुनता है .... इसलिए मुझे लगता है कि वे समान हैं। इसलिए यह कहना सही है कि वे दोनों सर्वर हैं जिनकी अपनी ताकत और कमजोरियां हैं?
आभारी

2
createServer सिर्फ एक सुनने का पोर्ट बनाता है। यह कुछ भी नहीं करता है।
रोजर एफ। गे

1
नोडज का उपयोग करने का क्या मतलब होगा यदि वह पोर्ट पर किसी अनुरोध पर कुछ परोसने नहीं जा रहा है तो पोर्ट पर सुनने के लिए क्रिएटर का उपयोग करें? ... इसलिए, यह तार्किक तरीके से एक "सर्वर" द्वारा एक या दूसरा तरीका है, नहीं?
GG2

@ RogerF.Gay ... यह एक निर्दिष्ट पोर्ट पर एक श्रोता बनाता है, और इनकमिंग अनुरोध पर एक कॉलबैक फ़ंक्शन निष्पादित करता है। मैं क्या कहूँगा कि यह एक सर्वर बनाता है।
नईम शेख

1
@ नईम शेख यह कुछ भी नहीं परोसता है। किसी ऐसी चीज़ को कॉल करना जो किसी सर्वर की सेवा नहीं करती है, इसका कोई मतलब नहीं है।
रोजर एफ। गे

1

मान लें कि अपाचे होटल नाम का एक होटल है जिसमें प्रत्येक ग्राहक के लिए एक वेटर है।

जैसे ही ग्राहक एक सलाद का आदेश देता है, वेटर महाराज के पास जाता है और उसे बताता है। जबकि शेफ भोजन तैयार करता है, वेटर इंतजार करता है। यहाँ,

Chef => File System,

Waiter => Thread,

Customer => Event.

जब ग्राहक पानी का आदेश देता है तब भी वेटर सलाद की सेवा करने के बाद ही लाता है। वेटर इंतजार करता रहता है जब तक कि शेफ द्वारा सलाद तैयार न हो जाए। इस राज्य को अवरुद्ध राज्य के रूप में जाना जाता है। यहां तक ​​कि अगर होटल बढ़ता है तो प्रत्येक ग्राहक को सेवा करने के लिए अलग-अलग वेटर होना चाहिए। इससे थ्रेड्स (वेटर) का अवरोध बढ़ जाता है।

अब, नोड होटल में आने से सभी ग्राहकों के लिए केवल एक वेटर है। यदि पहला ग्राहक ऑर्डर करता है तो वेटर महाराज को बताता है और दूसरे ग्राहक को जाता है। भोजन तैयार होने के बाद वेटर ग्राहक को देता है। यहां ग्राहक इंतजार नहीं करेगा। इस राज्य को गैर-अवरुद्ध राज्य के रूप में जाना जाता है। एकल वेटर (थ्रेड) सभी ग्राहक को सर्वर करता है और उन्हें खुश करता है।

इस प्रकार, नोड जो एक एकल थ्रेडेड अनुप्रयोग है, बहुत तेज़ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.