Kiedy powinienem przejść na NGinx?

11

Mam serwer z kilkoma domenami i aplikacjami działającymi przez Apache. W tej chwili wszystko jest w porządku, ale mam plany, aby opracować bardzo wymagającą wydajność aplikację internetową (wykorzystującą C ++ z CPPCMS), zaczynając od mojego serwera do testowania, być może otrzymując osobny serwer tylko dla tej aplikacji, gdy będzie gotowy.

W każdym razie dużo słyszałem o NGinx, który wydaje się być bardziej wydajny niż Apache, więc zadałem sobie pytanie, czy warto z nim pracować dla tego nowego projektu. Nie jest to dla mnie jasne, ponieważ nie wiem, jaki rodzaj wąskiego gardła w zakresie wydajności NGinx naprawia dokładnie.

Nie jestem zaawansowanym użytkownikiem Apache, jestem kiepskim administratorem Linuksa i nie rozwijam zbyt wiele aplikacji internetowych (ale mam pojęcia). Zajmuję się głównie pisaniem oprogramowania, więc część serwera jest czasami dla mnie bardzo niejasna. Za każdym razem, gdy muszę skonfigurować stronę internetową za pomocą apach, potrzebuję dużo czasu na przeglądanie dokumentu, aby upewnić się, że nie wszystko zepsuję.

Biorąc to pod uwagę, myślę, że po tej stronie mam się znacznie lepiej, ale wciąż potrzebuję porady. Widziałem kilka plików konfiguracyjnych Nginx i wydaje się to bardziej zrozumiałe niż Apache, ale może się mylę?

Z zebranych informacji wynika, że ​​NGinx byłby najlepszym wyborem, jeśli chcesz wyrównać obciążenie, więc jeśli masz aplikację rozłożoną na kilka komputerów, prawda? Gdy myślę o mojej aplikacji do scallingu (i wydajności), wygląda na to, że tego potrzebuję, ale może potrzebuję wiedzieć więcej na temat tego, kiedy warto przejść z Apache do NGinx. Czy warto przejść na NGinx także dla wszystkich moich obecnych aplikacji? Ile to kosztuje? (Mam na myśli, czy przejście z jednej na drugą jest kosztowne na czas?) Czy mogę używać Apache i NGinx zarówno na tej samej maszynie bez żadnego problemu?

Uwaga dodatkowa : Nie nakłaniaj mnie do używania języków interpretowanych zamiast C ++, nie ma to związku z pytaniem. Zobacz stronę uzasadnienia CPPCSM, aby zobaczyć, jaki rodzaj aplikacji może z tego skorzystać. Doskonale rozumiem wady (w porównaniu do aplikacji w Ruby i Pythonie, których już używam do mniej energochłonnych aplikacji internetowych) i nie mam nic przeciwko.

Klaim
źródło

Odpowiedzi:

10

Kilka punktów:

Główną różnicą między Apache a Nginx lub Lighttpd (którą osobiście bardzo lubię) jest architektura:

  1. Apache obsługuje jedno połączenie na proces lub wątek (w zależności od mod-XYZ)
  2. Nginx i Lighttpd są pojedynczymi wątkami obsługującymi wiele połączeń w pętli pojedynczych zdarzeń.

W rezultacie:

  1. Nginx i Lighttpd skalują się znacznie lepiej przy dużej liczbie jednoczesnych połączeń, powiedzmy, przy 1000 połączeń Apache prawie umarłby, ponieważ wymagałoby 1000 procesów w mod-prefork lub 1000 wątków w mod-robot.

    Jeśli planujesz używać technologii Comet, w których każde połączenie wymaga długiego połączenia HTTP z zapytaniem, Apache nie będzie akceptowalny, ponieważ nie skaluje się dobrze.

  2. Nginx i Lighttpd zużywają mniej pamięci, ponieważ każde połączenie wymaga + - dwóch gniazd (HTTP i FastCGI), bufora pamięci pośredniej i niektórych stanów, podczas gdy Apache potrzebuje całego wątku, w tym stosu i innych rzeczy.

Z mojego osobistego doświadczenia w testach porównawczych zrobiłem Lighttpd (i zakładam, że Nginx) jest nieco szybszy z backendem FastCGI niż Apache, ale dotyczy to małej liczby połączeń.

Teraz kolejną kwestią jest to, kiedy chcesz wykonać równoważenie obciążenia za pomocą połączeń FastCGI.

W tradycyjnej architekturze jest

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Ponieważ Apache obsługuje pule procesów, na każdym z nich działa mod-PHP (lub inne tryby)

Korzystając z CppCMS, który samodzielnie obsługuje pule, możesz zrobić coś innego:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Zasadniczo więc nie potrzebujesz kolejnego poziomu pośredniego, ponieważ CppCMS obsługuje dla ciebie proces, wątek i pulę połączeń. Podczas gdy PHP / Ruby / Perl potrzebuje trochę modów Apache XYZ lub obsługuje własne złącze FastCGI.

Artem
źródło
+1 Fajne pełne wyjaśnienie autora CppCMS;) Ok, teraz lepiej widzę ogólny problem. Więc jeśli masz tylko jeden serwer (na początek) to HTTP-> Balancer-> FCGI-> CPPCMS, jeśli dobrze rozumiem? Co sądzisz o radach z komentarza Jespera Mortensena, mówiącego, że FastCGI nie jest szybki?
Klaim,
@Klaim: Spójrz na doskonałe rysunki powyżej - w tej architekturze FastCGI jest używany jako połączenie między wieloma serwerami, z których każdy uruchamia wielowątkową instancję CppCMS. Względna szybkość FastCGI ma w tym przypadku znacznie mniejsze znaczenie; twoimi alternatywami byłyby HTTP, AJP i inne protokoły sieciowe, które również nie są „szybkie”. Ta odpowiedź powinna być prawdopodobnie oznaczona jako zaakceptowana, a twoje pytanie poddane edycji, ponieważ tak naprawdę nie chodzi o to, kiedy nginx jest tego wart.
Jesper M
@Jesper Mortensen> Zgadzam się, ale jaką modyfikację pytania dokładnie sugerujesz?
Klaim
6

Mówiąc bardzo ( bardzo ) ogólnie, Nginx może uzyskać znacznie wyższą przepustowość niż Apache dzięki odmiennemu podejściu architektonicznemu do problemu wyświetlania stron w Internecie. Nginx został również zbudowany przede wszystkim jako zwrotny serwer proxy i wyjątkowo dobrze wypełnia tę rolę (jest to bit równoważenia obciążenia, o którym wspominałeś); Z drugiej strony Apache został stworzony do obsługi stron internetowych, a później zyskał możliwość proxy.

To powiedziawszy, prawie na pewno istnieją obszary, w których Apache będzie konsekwentnie osiągać lepsze wyniki niż Nginx, podczas gdy istnieją inne obszary, w których Nginx równie dobrze osiąga lepsze wyniki niż Apache.

Krótka odpowiedź brzmi: jeśli Apache działa dla ciebie, nie musisz się przełączać. (I mówię to jako były użytkownik Apache, który został całkowicie przekonwertowanym uczniem Nginx.) Tylko wtedy, gdy ruch do twojego serwera zaczyna osiągać poziomy, w których Apache staje się twoim wąskim gardłem (jest to rzędu kilku tysięcy jednoczesnych połączeń, ale będzie się różnić w zależności od specyfikacji serwera i innego obciążenia serwera), lub jeśli próbujesz uruchomić Apache w środowisku ubogim w zasoby, gdzie ledwo się zmieści, to czy przejście na Nginx daje ci solidną korzyść.

To powiedziawszy, jeśli chcesz przejść na Nginx (do czego zachęcam!), To idź. Czy zobaczysz jakieś korzyści? 9 razy na 10: Nie, nie będziesz. Ale wspomniałeś, że bardziej podoba Ci się język plików konfiguracyjnych Nginx, więc jeśli wygodniej jest skonfigurować Nginx niż Apache, to jest to dla Ciebie korzyść! (Osobiście uważam, że konfiguracje Apache są ogólnie łatwiejsze do odczytania, ale może to być spowodowane tym, że spędziłem wiele, wiele lat czytając je, a na Nginx spędziłem tylko kilka krótkich miesięcy!)

Na marginesie: Wspomniałeś o chęci zbudowania aplikacji internetowej w C ++. Ze względu na twoje zdrowie psychiczne zdecydowanie zachęcam do korzystania z języka wyższego poziomu, takiego jak PHP, Python, a nawet Java. Następnie profiluj swój kod i zastanów się nad utworzeniem modułów opartych na C ++, aby rozwiązać określone wąskie gardła (zarówno Python, jak i PHP pozwalają na to dość łatwo; nie wiem o Javie). Jeśli martwisz się ogólną wydajnością, zastanów się nad tym: EVE Online, największa na świecie niechroniona gra MMORPG, jest oparta na wariancie Pythona (Python bez stosu), z tylko kluczowymi komponentami (np. Bibliotekami graficznymi) napisanymi w C ++. Jeśli Python sobie z tym poradzi, to z pewnością poradzi sobie z aplikacją internetową?

Kromey
źródło
+1 dzięki. O C ++, patrz mój komentarz do odpowiedzi Jespera Mortensena. Ponadto, nawet jeśli Python jest używany po stronie serwera Eve Online (wiem o tym bardzo dużo) AFAIK, to zarządza tylko kodem gry (to jest duży), a niektóre inne części są w rzeczywistości w C ++. Kod graficzny jest po stronie klienta, więc C ++ jest obowiązkowy dla tego typu wydajności graficznej. Tak jak powiedziałem, zobacz stronę CPPCMS Rationale o tym, dlaczego to wybrałem. Gdybym postępował zgodnie z twoją radą, musiałbym napisać moją aplikację dwa razy, podczas gdy już wiem, że jest to bardzo energochłonne. Rozumiem także wady i nie mam nic przeciwko.
Klaim
3

Nikt tak naprawdę nie może odpowiedzieć na pytanie „kiedy powinienem przełączyć” - będzie to zależeć od obciążenia, wydajności własnego kodu aplikacji itp.

NGinx, który wydaje się być bardziej wydajny niż Apache

nginx używa pojedynczego procesu (lub bardzo małej liczby procesów roboczych) do obsługi wszystkich połączeń klienckich za pomocą zdarzeń I / O. Apache ma kilka dostępnych modułów „Multi-Processing Modules” , ale wszystkie one bardziej skłaniają się ku wielu procesom / wielu wątkom. W rezultacie Apache ogólnie zużywa więcej pamięci RAM i procesora niż nginx do podstawowej obsługi połączeń HTTP. Przegląd różnych podejść do obsługi połączeń można znaleźć na stronie C10K firmy Kegel .

bardzo wydajna aplikacja internetowa (wykorzystująca C ++ z CPPCMS)

Chciałbym zdecydowanie sugerują rozważenie podstawowej webapp w języku wyższego poziomu (Python, Ruby, czy może Scala), i używać messsage kolejka wysłać bilety pracy maszyn roboczych, które zajmują się zadaniami „Wydajność-Intensive” asynchronicznie.

NGinx byłby najlepszym wyborem, jeśli chcesz wyrównać obciążenie,

nginx jest dobrym narzędziem równoważącym obciążenie; ale w tej przestrzeni jest wiele opcji .

Czy mogę bez problemu używać Apache i NGinx na tym samym komputerze?

Tak. Po prostu uruchom je na różnych numerach portów IP i / lub adresach IP.

Jesper M.
źródło
„Zdecydowanie sugerowałbym rozważenie wykonania podstawowej aplikacji internetowej w języku wyższego poziomu”> Nie powiedziałem, że jest to prosta aplikacja internetowa - nie jest to nawet trywialne. Jeśli widzisz uzasadnienie użycia CPPCMS, autor wskazuje kilka przypadków, w których może to być przydatne, a ja jestem w takich przypadkach. Rozważałem inne alternatywy, ale znalazłem je droższe niż używanie C ++, przynajmniej w rodzaju aplikacji internetowej, którą piszę. Więc to nie jest część pytania. Ale rozumiem twoją radę i daje to samo ludziom, którzy pytają mnie, czy powinni używać C ++ do aplikacji internetowych. Planuję również użyć Pythona do innej, bardziej prostej aplikacji.
Klaim
W każdym razie +1 za szczegóły.
Klaim
@Klaim: Jeśli chcesz zrealizować deklarowaną poprawę wydajności „rzędu wielkości” w stosunku do dobrze dostrojonej implementacji C # / Java, sprawdź, czy możesz uruchomić CppCMS i kod aplikacji na swoim serwerze WWW - tj. Jako wtyczkę do nginx / Apache. Strony CppCMS wydają się pokazywać FastCGI jako połączenie między serwerem WWW a CppCMS; a tak naprawdę FastCGI nie jest ... szybki.
Jesper M
> Ciekawy pomysł. Większość porad dotyczy tego, że powinieneś używać fastcgi, ponieważ jest szybszy niż alternatywy. Sprawdzę, czy mogę to zrobić, może zobaczę z autorem CPPCMS, dlaczego uważa, że ​​jest to najszybszy.
Klaim