node.js czy nakładka nginx do obsługi plików statycznych?

90

Czy jest jakiś test porównawczy lub porównanie, które jest szybsze: umieść nginx przed węzłem i pozwól mu bezpośrednio obsługiwać pliki statyczne lub użyj tylko węzła i obsługuj pliki statyczne za jego pomocą?

Rozwiązanie nginx wydaje się być dla mnie łatwiejsze w zarządzaniu, jakieś myśli?

artvolk
źródło
3
Powiedziałbym, że zależy to również od ilości konfiguracji i kodu, który musisz napisać, aby używać jednego serwera nad drugim. Jeśli nie spodziewasz się IPO, a Twój serwer aplikacji jest już skonfigurowany i robi wszystko, czego potrzebujesz, możesz po prostu trzymać się go, dopóki nie będzie to wystarczające.
m33lky

Odpowiedzi:

119

Muszę się nie zgodzić z odpowiedziami tutaj. Podczas gdy Node poradzi sobie dobrze, nginx z pewnością będzie szybszy, gdy zostanie poprawnie skonfigurowany. nginx jest efektywnie zaimplementowany w języku C zgodnie z podobnym wzorcem (powrót do połączenia tylko w razie potrzeby) z niewielkim zużyciem pamięci. Co więcej, obsługuje wywołanie systemowe sendfile, aby obsłużyć te pliki, które są tak szybkie, jak to tylko możliwe, podczas udostępniania plików, ponieważ to samo jądro systemu operacyjnego wykonuje zadanie.

Do tej pory nginx stał się de facto standardem jako serwer frontendowy. Możesz go użyć do obsługi plików statycznych, gzip, SSL, a nawet później do równoważenia obciążenia.

PS: Zakłada się, że pliki są naprawdę „statyczne”, ponieważ znajdują się na dysku w momencie żądania.

m33lky
źródło
7
Tylko drobna uwaga: node.js również obsługuje sendfile- ale wygląda na to, że musisz napisać jakiś kod, patrz np. blog.std.in/2010/09/09/using-sendfile-with-nodejs
tuomassalo
Dlaczego poza obsługą zawartości statycznej wydajność Nginx jest lepsza niż po prostu eksponowanie głównego serwera internetowego (Tomcat / Jetty / IIS itp.) W domenie publicznej?
rafian
1
Jeśli żądanie zostanie wysłane do Twojej aplikacji, nie zostanie ono wykonane magicznie szybciej, kierując je najpierw przez nginx (może być zauważalnie szybsze w najlepszym przypadku, gdy nginx obsługuje statyczne CSS i js, gzip i SSL). Jednak nginx jest również jednym z najlepszych programów do równoważenia obciążenia, więc może to być krytyczne, ponieważ większość serwerów jest notorycznie wyłączana przy umiarkowanie wysokich obciążeniach.
m33lky
Ale możesz serwerować pliki w sposób asynchroniczny za pomocą Node.js. Czy możesz to zrobić z NGINX?
Dragos C.
1
@lwansbrough przedstawia te testy porównawcze. Przynajmniej jedna osoba zajmująca się tym tematem przeprowadziła własne eksperymenty.
m33lky
75

Zrobiłem szybko, ab -n 10000 -c 100aby obsłużyć statyczny bajt 1406 favicon.ico, porównując nginx, Express.js (statyczne oprogramowanie pośredniczące) i Express.js w klastrze. Mam nadzieję że to pomoże:

wprowadź opis obrazu tutaj

Niestety nie mogę przetestować 1000 lub nawet 10000 jednoczesnych żądań, ponieważ nginx na moim komputerze zacznie generować błędy.

EDYCJA : zgodnie z sugestią artvolka, oto wyniki klastra + staticoprogramowanie pośredniczące (wolniejsze):

wprowadź opis obrazu tutaj

gremo
źródło
Dziękuję, bardzo pomocne! Czy korzystałeś z tego oprogramowania pośredniego dla favicon: senchalabs.org/connect/favicon.html, czy po prostu udostępniłeś go jako plik statyczny?
artvolk
@artvolk the favicon one :)
gremo
3
Czy ustawiłeś NODE_ENV = produkcja do testów? Ponieważ spowodowałoby to niewiarygodną różnicę, ponieważ staticoprogramowanie pośredniczące do buforowania zrobi w produkcji.
ruffrey
21
dla tych z Was, którzy nie mówią po włosku, oś x to liczba żądań, a oś Y to liczba ms, które zajęło obsłużenie pliku. Musiałem to przetłumaczyć w Google, ponieważ chciałem się upewnić, że nie odczytałem danych źle. te dane były niewiarygodnie pomocne i naprawdę doceniam test porównawczy tutaj. w końcu pozostanie przy nginx
JL Griffin
1
Czy NODE_ENV = zestaw produkcyjny?
basickarl
11

Mam inną interpretację wykresów @ gremo. Wydaje mi się, że zarówno skala węzła, jak i nginx przy tej samej liczbie żądań (między 9-10 tys.). Jasne, opóźnienie odpowiedzi dla nginx jest niższe o stałe 20 ms, ale nie sądzę, aby użytkownicy koniecznie dostrzegli tę różnicę (jeśli twoja aplikacja jest dobrze zbudowana). Biorąc pod uwagę stałą liczbę maszyn, zajęłoby to dość duże obciążenie, zanim przekonwertowałbym maszynę węzła na nginx, biorąc pod uwagę, że węzeł jest miejscem, w którym większość obciążenia wystąpi w pierwszej kolejności. Jedynym przeciwwagą jest to, że już przeznaczasz maszynę dla nginx do równoważenia obciążenia. Jeśli tak jest, równie dobrze możesz sprawić, że będzie on obsługiwał również zawartość statyczną.

ssotangkur
źródło
1
„Jasne, że opóźnienie odpowiedzi w przypadku nginx jest mniejsze o stałe 20 ms, ale nie sądzę, aby użytkownicy koniecznie dostrzegli tę różnicę”? Naprawdę mam nadzieję, że tego nie zrobicie. Istnieją dowody na to, że użytkownicy zauważą różnicę 1 ms!
Navin
4
Potrzebne źródło
David Burrows,
9

Tak czy inaczej, skonfigurowałbym Nginx, aby buforował pliki statyczne ... zobaczysz tam OGROMNĄ różnicę. Następnie, niezależnie od tego, czy obsługujesz je z węzła, czy nie, w zasadzie uzyskujesz taką samą wydajność i takie samo odciążenie w aplikacji węzła.

Osobiście nie podoba mi się pomysł, że mój frontend Nginx obsługuje statyczne zasoby w większości przypadków

1) Projekt musi teraz znajdować się na tym samym komputerze - lub musi zostać podzielony na zasoby (na komputerze nginx) i aplikację internetową (na wielu komputerach w celu skalowania)

2) Konfiguracja Nginx musi teraz utrzymywać lokalizacje ścieżek dla statycznych zasobów / przeładowania, gdy się zmienią.

Will Stern
źródło
0

To trudne pytanie. Jeśli napisałeś naprawdę lekki serwer węzłów, który obsługuje tylko pliki statyczne, najprawdopodobniej działałby lepiej niż nginx, ale nie jest to takie proste. ( Oto "test porównawczy" porównujący serwer plików nodejs i lighttpd - który jest podobny pod względem wydajności do ngingx podczas obsługi plików statycznych).

Wydajność w zakresie obsługi plików statycznych często sprowadza się do czegoś więcej niż tylko serwera WWW wykonującego pracę. Jeśli chcesz uzyskać najwyższą możliwą wydajność, będziesz używać CDN do obsługi plików, aby zmniejszyć opóźnienia dla użytkowników końcowych i skorzystać z buforowania na krawędzi.

Jeśli się tym nie martwisz, node może obsługiwać pliki statyczne w większości sytuacji. Węzeł nadaje się do kodu asynchronicznego, na którym również polega, ponieważ jest jednowątkowy, a każde blokujące operacje wejścia / wyjścia mogą zablokować cały proces i obniżyć wydajność aplikacji. Najprawdopodobniej piszesz swój kod w sposób nieblokujący, ale jeśli robisz coś synchronicznie, możesz spowodować blokowanie, które zmniejszyłoby szybkość obsługi plików statycznych przez innych klientów. Łatwym rozwiązaniem jest nie pisanie kodu blokującego, ale czasami nie jest to możliwe lub nie zawsze można go wymusić.

Brad Harris
źródło
9
To wszystko jest nonsensem. To pytanie dotyczy nginx, a nie Apache. Zarówno nginx, jak i node używają libev do ich pętli zdarzeń. Nginx będzie wielokrotnie szybszy niż node. Jeden z nich nie ma narzutu maszyny wirtualnej i jest napisany specjalnie do wykonywania tej operacji w systemie plików.
Evan Carroll,
1
libev był wczesnym węzłem. Libuv przyjął tę rolę, aby umożliwić działanie węzła na wielu platformach.
tsturzl
1
Nie rozumiem, jak wpływa na to kod asynchroniczny. Wydajność węzła będzie znacznie gorsza niż Nginx i prawdopodobnie będzie to spowodowane blokowaniem operacji we / wy, na które napotkasz, gdy masz grupę klientów proszących o odczytanie plików z dysku. Najlepszą praktyką jest zawsze używanie Nginx do zasobów statycznych, aby aplikacja Node mogła obsługiwać logikę aplikacji. Moglibyśmy porozmawiać o teoretycznych scenariuszach, w których Node będzie działał lepiej, ale w prawdziwym świecie Nginx wygra o milę 9 razy na 10.
wgp
-11

Jestem pewien, że czysto node.js może przewyższać nginx pod wieloma względami.

Wszystko powiedziawszy, muszę pozostać NginX ma wbudowaną pamięć podręczną, podczas gdy node.js nie jest instalowany fabrycznie (MUSISZ ZBUDOWAĆ WŁASNĄ CACHE PLIKÓW). Niestandardowa pamięć podręczna plików przewyższa nginx i każdy inny serwer na rynku, ponieważ jest bardzo prosta.

Również Nginx działa na wielu rdzeniach. Aby w pełni wykorzystać potencjał Node, musisz połączyć serwery węzłów w klastry. Jeśli chcesz wiedzieć, jak to zrobić, proszę o godz.

Trzeba głębiej kopać, aby osiągnąć nirwanę wydajności z node, to jedyny problem. Raz zrobione piekło tak ... to bije Nginx.

user2379441
źródło
1
musisz przynieść kilka faktów, ponieważ chciałbym wierzyć w to, co mówisz, ale potrzebujesz testów porównawczych, jeśli są oparte na prawdziwym świecie, świetnie! ale nie skrajne przypadki
Stefan Rogin
5
Zabawne jest to, że ta odpowiedź zawiera tyle faktów, ile wybrana odpowiedź z największą liczbą pozytywnych głosów. Myślę, że ludzie wolą po prostu serwer sieciowy z przodu, ponieważ tak ich nauczono [wstawić jakąkolwiek inną technologię aplikacji internetowych]. To nie jest dobra odpowiedź, ale +1 z litości.