Niedawno studiowałem Node.js i znalazłem materiał na temat pisania prostych serwerów opartych na Node.js. Na przykład następujące.
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!");
});
Teraz, chociaż wydaje mi się, że rozumiem, co się dzieje w kodzie, jestem nieco zdezorientowany terminologią. Kiedy słyszę termin serwer, myślę o takich rzeczach jak Apache czy Nginx. Przywykłem do myślenia o nich jako o pojemniku, w którym mogą znajdować się moje aplikacje internetowe. Czym serwer Node.js różni się od serwera Nginx / Apache? Czy nie jest prawdą, że serwer oparty na Node.js (tj. Kod) nadal można umieścić w czymś takim jak Nginx, aby działał? Dlaczego więc oba nazywane są „serwerami”?
Isn't it true that a Node.js based server (i.e. code) will still be placed within something like Nginx to run?
Nie, to nieprawdaOdpowiedzi:
To serwer, tak.
Aplikacja sieciowa node.js to pełnoprawny serwer WWW, taki jak Nginx czy Apache.
Rzeczywiście możesz obsługiwać swoją aplikację node.js bez korzystania z innego serwera WWW. Po prostu zmień swój kod na:
app = express(); http.createServer(app).listen(80); // serve HTTP directly
Rzeczywiście, niektóre projekty używają node.js jako front- endowego systemu równoważenia obciążenia dla innych serwerów (w tym Apache).
Zauważ, że node.js nie jest jedynym stosem programistycznym, który to robi. Robią to również frameworki do tworzenia stron internetowych w Go, Java i Swift.
Czemu?
Na początku było CGI. CGI było w porządku i działało OK. Apache otrzymałby żądanie, stwierdził, że adres URL musi wykonać aplikację CGI, wykonać tę aplikację CGI i przekazać dane jako zmienne środowiskowe, odczytać standardowe wyjście i przesłać dane z powrotem do przeglądarki.
Problem w tym, że jest powolny. Jest OK, gdy aplikacja CGI była małym statycznie skompilowanym programem w C, ale grupa małych statycznie skompilowanych programów w C stała się trudna do utrzymania. Więc ludzie zaczęli pisać w językach skryptowych. Potem stało się to trudne do utrzymania i ludzie zaczęli tworzyć zorientowane obiektowo frameworki MVC. Teraz zaczęliśmy mieć kłopoty - KAŻDE ŻĄDANIE musi skompilować wszystkie te klasy i utworzyć wszystkie te obiekty tylko po to, aby obsłużyć jakiś HTML, nawet jeśli nie ma nic dynamicznego do obsłużenia (ponieważ framework musi dowiedzieć się, że nie ma nic dynamicznego do obsłużenia).
A co, jeśli nie musimy tworzyć wszystkich tych obiektów w każdym żądaniu?
Tak myśleli ludzie. Z próby rozwiązania tego problemu wyszło kilka strategii. Jednym z najwcześniejszych było osadzenie tłumaczy bezpośrednio na serwerach internetowych, takich jak
mod_php
Apache. Skompilowane klasy i obiekty mogą być przechowywane w zmiennych globalnych, a zatem buforowane. Inną strategią było wykonanie wstępnej kompilacji. Kolejną strategią było uruchomienie aplikacji jako zwykłego procesu serwera i rozmowa z serwerem WWW przy użyciu niestandardowego protokołu, takiego jak FastCGI.Następnie niektórzy programiści zaczęli po prostu używać HTTP jako protokołu aplikacji-> serwera. W efekcie aplikacja jest również serwerem HTTP. Zaletą tego jest to, że nie musisz implementować żadnego nowego, prawdopodobnie błędnego, prawdopodobnie nie przetestowanego protokołu i możesz debugować swoją aplikację bezpośrednio za pomocą przeglądarki internetowej (lub często
curl
). I nie potrzebujesz zmodyfikowanego serwera internetowego do obsługi swojej aplikacji, po prostu dowolnego serwera internetowego, który może wykonywać odwrotne proxy lub przekierowania.Dlaczego warto korzystać z Apache / Nginx?
Gdy udostępniasz aplikację node.js, pamiętaj, że jesteś autorem własnego serwera internetowego. Każdy potencjalny błąd w Twojej aplikacji to błąd, który można bezpośrednio wykorzystać w Internecie. Niektórym ludziom (słusznie) to nie odpowiada.
Dodanie warstwy Apache lub Nginx przed aplikacją node.js oznacza, że masz przetestowane w walce, zabezpieczone oprogramowanie w Internecie na żywo jako interfejs do Twojej aplikacji. Dodaje odrobinę opóźnienia (odwrotne proxy), ale większość uważa, że warto.
To była standardowa rada we wczesnych dniach node.js. Ale w dzisiejszych czasach istnieją również witryny i usługi internetowe, które udostępniają node.js bezpośrednio w Internecie.
http.Server
Moduł jest teraz dość dobrze bitwa testowane w internecie można ufać.źródło
NodeJs tworzy własny serwer. Jak widać, terminologia jest dość jasna:
http.createServer(app).listen(3000);
Utwórz serwer i nasłuchuj żądań http na porcie 3000.
Użyliśmy nginx w jednym z naszych projektów, ale był on bardziej podobny do loadbalancera dla wielu instancji nodejs.
Powiedzmy, że masz dwie instancje nodejs działające na portach 3000 i 3001. Teraz możesz nadal używać
nginx
jako serwera do nasłuchiwania twoich rzeczywistychhttp
połączeńport 80
i możesz chcieć przekierować twoje żądanie donodejs
serwera lub może innego serwera, bardziej jakloadbalancer
. Więc nadal możesz używać tego, conginx
zapewnianodejs
.Dobre pytanie już tutaj zadane .
źródło
Załóżmy, że istnieje hotel o nazwie Apache Hotel, który ma kelnera dla każdego klienta.
Gdy klient zamówi sałatkę, kelner udaje się do szefa kuchni i mówi mu o tym. Podczas gdy szef kuchni przygotowuje jedzenie, kelner czeka. Tutaj,
Chef => File System,
Waiter => Thread,
Customer => Event.
Nawet gdy klient zamawia wodę, kelner przynosi dopiero po podaniu sałatki. Kelner czeka na przygotowanie sałatki przez szefa kuchni. Ten stan jest nazywany stanem blokującym. Nawet jeśli hotel się rozrasta, każdy klient powinien mieć różnych kelnerów do obsługi. Zwiększa to blokowanie wątków (kelnerów).
Teraz w Node Hotel jest tylko jeden kelner dla wszystkich klientów. Jeśli pierwszy klient zamówi zupę, kelner informuje o tym szefa kuchni i udaje się do drugiego klienta. Po przygotowaniu potraw kelner dostarcza je do klienta. Tutaj klient nie będzie czekał. Ten stan jest nazywany stanem nieblokującym. Jeden kelner (wątek) obsługuje wszystkich klientów i sprawia, że są szczęśliwi.
W ten sposób Node, który jest aplikacją jednowątkową, jest bardzo szybki.
źródło