Używanie tylko Node.js vs. Node.js z Apache / Nginx


224

W jakich przypadkach należy używać Node.js tylko jako serwera podczas rzeczywistego wdrożenia?

Jeśli ktoś nie chce używać tylko Node.js, co gra lepiej w Node.js? Apache czy Nginx?

Odpowiedzi:


207

Istnieje kilka dobrych powodów, aby trzymać inny serwer WWW przed Node.js:

  • Nie musisz martwić się o uprawnienia / setuid dla procesu Node.js. Zwykle tylko root może się połączyć z portem 80. Jeśli pozwolisz nginx / Apache martwić się uruchomieniem jako root, powiązaniem z portem 80, a następnie rezygnacją z uprawnień roota, oznacza to, że Twoja aplikacja Node nie musi się tym martwić.
  • Udostępnianie plików statycznych, takich jak obrazy, css, js i HTML. Węzeł może być mniej wydajny w porównaniu do korzystania z odpowiedniego serwera sieci web z plikiem statycznym (Węzeł może być również szybszy w wybranych scenariuszach, ale nie jest to normalne). Oprócz plików obsługujących wydajniej, nie będziesz musiał się martwić o obsługę tagów eTag lub nagłówków kontroli pamięci podręcznej tak, jak gdybyś obsługiwał rzeczy poza węzłem. Niektóre frameworki mogą sobie z tym poradzić, ale chciałbyś mieć pewność. Niezależnie od tego, prawdopodobnie prawdopodobnie wolniej.
  • Jak wspomniał Matt Sergeant w swojej odpowiedzi, możesz łatwiej wyświetlić znaczące strony błędów lub wrócić do strony statycznej, jeśli usługa węzła ulegnie awarii. W przeciwnym razie użytkownicy mogą uzyskać limit czasu połączenia.
  • Uruchomienie innego serwera WWW przed Węzłem może pomóc w złagodzeniu luk bezpieczeństwa i ataków DoS na Węzeł. Dla przykładu w świecie rzeczywistym, CVE-2013-4450 jest uniemożliwione przez prowadzenie coś podobnego Nginx przed węzłem .

Zastrzegam drugi punkt, mówiąc, że prawdopodobnie powinieneś podawać swoje pliki statyczne za pośrednictwem CDN lub zza serwera buforującego, takiego jak Varnish. Jeśli to robisz, tak naprawdę nie ma znaczenia, czy źródłem jest Node, Nginx czy Apache.

Zastanów się w szczególności nad nginx: jeśli używasz websockets, upewnij się, że korzystasz z najnowszej wersji nginx (> = 1.3.13), ponieważ dodała ona tylko obsługę aktualizacji połączenia w celu korzystania z websockets.


11
express.staticporadzi sobie z tagami ETag i nagłówkami kontroli pamięci podręcznej.
robertklep


4
pauljz, czy masz testy porównawcze, które chcesz wykonywać wolniej? artykuły, na które wskazał @pawlakpp, wydają się mówić, że Node.js jest znacznie szybszy pod obciążeniem.
Samuel Neff

3
Dyskusja tutaj: stackoverflow.com/questions/9967887/... z kilkoma dodatkowymi perspektywami. Benchmarki tam (ponieważ poprosiłeś o dodatkowe testy) pokazują node.js / express, nawet zgrupowane, zauważalnie słabo osiągające. Uważam, że najlepiej jest całkowicie wstrzymywać wyświetlanie plików statycznych i obsługę żądań poza pętlą zdarzeń węzła, zapisywać te cykle dla pracy, która musi się zdarzyć w węźle. Ale szczerze mówiąc, jeśli podasz statyczne rzeczy poza Węzłem, również ci będzie dobrze. To nie jest wielka sprawa.
pauljz

4
Należy zauważyć, że jeśli używasz tylko węzła bezpośrednio, nadal możesz łączyć się z zarezerwowanymi portami, takimi jak :80bez uruchamiania węzła jako root, po prostu używając authbind: thomashunter.name/blog/using-authbind-with-node-js
wyqydsyq

70

Aby dodać jeszcze jeden powód do odpowiedzi pauljza, używam serwera frontonu, aby mógł obsługiwać 502 strony błędów podczas restartowania serwera backend lub z jakiegoś powodu ulega awarii. Dzięki temu użytkownicy nigdy nie otrzymają błędu dotyczącego niemożności nawiązania połączenia.


28

Uważam, że używanie Węzła do obsługi plików statycznych jest odpowiednie we wszystkich okolicznościach, o ile wiesz, co robisz . Z pewnością jest to nowy paradygmat używania serwera aplikacji do obsługi plików statycznych, ponieważ tak wiele (co?) Konkurencyjnych technologii (PHP, Ruby, Python itp.) Wymaga serwera WWW takiego jak HTTPD lub Nginx przed serwerami aplikacji .

Każdy obiektywny powód, dla którego kiedykolwiek czytałem przeciwko podawaniu plików statycznych za pomocą Node, opiera się na idei używania tego, co wiesz najlepiej lub używania tego, co jest postrzegane jako lepiej przetestowane / bardziej stabilne. Są to bardzo ważne powody praktycznie, ale mają niewielkie znaczenie czysto techniczne.

O ile nie znajdziesz funkcji, która jest możliwa w przypadku klasycznego serwera WWW, która nie jest możliwa w przypadku Węzła (i wątpię, że to zrobisz), wybierz to, co wiesz najlepiej lub z czym wolisz pracować, ponieważ oba podejścia są w porządku.

Co do Nginx vs Apache - będą „grać” tak samo z Node. Powinieneś porównać je bez względu na Węzeł.


2
Dobra perspektywa ogólnych porównań technicznych: „Każdy obiektywny powód, dla którego kiedykolwiek czytałem, że nie obsługuję plików statycznych za pomocą Node, opiera się na pomyśle wykorzystania tego, co wiesz najlepiej, lub użycia tego, co postrzegane jest jako lepiej przetestowane / bardziej stabilne. Są to bardzo ważne powody praktycznie, ale mają niewielkie znaczenie czysto techniczne. ” Obecnie zbyt wiele porównań jest stronniczych i opiera się na doświadczeniu i poziomie komfortu na gorszych, ale sprawdzonych w czasie technologiach.
Sunny,

Tak, ale są to naprawdę / subiektywne / powody. Świetnym przykładem obiektywnego powodu byłby punkt odniesienia - z których większość znalazłem wskazuje nginx> nodejs (chociaż naprawdę powinienem zrobić swój własny ....)
Nick

@Nick Masz absolutną rację. Jest ich kilka, choć nie jestem ekspertem w dziedzinie badań porównawczych, więc pozwolę ludziom przeszukać sieć. Powiem jednak, że myślę, że prostota korzystania z jednego serwera zamiast dwóch jest korzystna. Po prostu istnieje mniejsze prawdopodobieństwo, że coś pójdzie nie tak. Z drugiej strony, Nginx ma zazwyczaj pakiet na każdym systemie Unix-like z dobrej konfiguracji natomiast z węzła trzeba dowiedzieć się, integracji z systemd, pm2itd Tak więc są plusy i minusy, a użytkownik powinien wybrać swój jad, że tak powiem .

Myślałem, że jest odwrotnie - węzeł radziłby sobie lepiej pod obciążeniem (być może nie w czystej prędkości bez obciążenia), ponieważ nie musi przekazywać procesu obsługującego plik na żądanie, ale może przekazywać dane, gdy dysk lokalny lub klient zdalny jest gotowy na ten sam wątek, co wszystkie pozostałe tysiące klientów. To oczywiście psuje się, gdy masz wiele procesorów. Chyba że węzeł wie, jak ich teraz używać. Lub serwery WWW mogą teraz korzystać z wielozadaniowości kooperacyjnej do serwerów statycznych stron ...
Gerard ONeill

1

Dodatek: ważne jest również, jeśli potrzebujesz odwrotnego proxy, na przykład, aby uruchomić serwer Websocket na tym samym porcie, lub może mieszać niektóre techonlogie (odpowiedz na niektóre żądania NodeJS i na PHP inne lub cokolwiek innego)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.