Apache vs Nginx

29

Niedawno badałem różnice między Apache a Nginx i jestem zdezorientowany, co powinienem wybrać.

Przeprowadziłem pewne poszukiwania, ale nie ma definitywnego porównania między nimi i zastanawiałem się, czy ktoś tutaj mógłby wyrazić swoje opinie na temat różnic między nimi.

Moja obecna wiedza pozwala mi zrozumieć, że mod_php jest szybszy i bezpieczniejszy niż fastcgi, jednak Apache jest znacznie gorszy, jeśli chodzi o jednoczesne połączenia i zużycie pamięci.

Moja strona korzysta z długiego sondowania, ale ma bazę internetową inną niż AJAX (tj. Apache z długim sondowaniem u góry).

Moje oryginalne rozwiązanie problemów z pamięcią Apache polegało na wysyłaniu długiego odpytywania przez node.js, a następnie tak, aby node.js uzyskiwał dostęp do Apache co 2 sekundy, w takim przypadku Apache nie miałoby otwartego połączenia, ale zamiast tego node.js. Doszedłem do wniosku, że to może nie być wystarczająco dobre i szukam różnych rozwiązań. Nadal jestem zainteresowany tym, czy mój oryginalny pomysł zadziałałby.

Więc co jest lepsze dla nowoczesnej sieci? Apache czy Nginx?

Aktualizacja: Wszystkie podane sugestie były dobre i aktualne. Poszedłem z oryginalnym drugim pomysłem, który polega na użyciu pełnego serwera Nginx. Jestem zadowolony, że będąc serwerem dedykowanym, nie mogłem cierpieć z powodu problemów związanych z bezpieczeństwem od fastcgi, a ponieważ moje długie skrypty odpytywania muszą być napisane w PHP, potrzebuję serwera, który poradzi sobie z jednoczesnym połączeniem przy dużym obciążeniu, a Apache po prostu nie może tego zrobić bez względu na to, jak bardzo Zmieniam strukturę, wciąż będzie głodna pamięci.

Zaznaczyłem odpowiedź Martina F, ponieważ udzielił tak jasnej i kompletnej odpowiedzi na moje pytania, że ​​uważam, że zasługuje na ocenę, jednak wszystkie trzy odpowiedzi były dobre i prawidłowe i zdecydowanie rozważą użycie odwrotnego proxy dla innej witryny, której jestem właścicielem ponieważ właśnie znalazłem coś bardzo, bardzo kool, co Nginx może zrobić w proxy.

Dzięki,

Sammaye
źródło

Odpowiedzi:

28

Wydaje się, że masz kilka nieporozumień, które moim zdaniem wymagają rozwiązania.

Po pierwsze, mod_php jest tylko nieznacznie szybszy, wszystkie moje testy wykazały, że różnica jest tak drobna, że ​​nie warto jej uwzględniać. Wątpię również, czy aspekt bezpieczeństwa jest dla ciebie istotny, ponieważ wydaje się, że patrzysz na serwer dedykowany i mod_php naprawdę ma przewagę tylko we współdzielonym środowisku - w rzeczywistości w dedykowanym środowisku php-fpm będzie miało tę przewagę, że PHP i twój serwer WWW działają teraz jako różne procesy, a to nawet nie uwzględnia niesamowitych opcji rejestrowania w php- fpm, takie jak wolny dziennik.

Jeśli świat byłby czarno-biały, powiedziałbym, że idź z czystą konfiguracją nginx i skompiluj php z php-fpm. Bardziej realistycznie, jeśli masz już Apache działający, uczyń nginx odwrotnym proxy do Apache, a możesz zaoszczędzić kilka godzin czasu konfiguracji, a różnica w wydajności będzie niewielka.

Ale załóżmy, że świat jest czarno-biały na sekundę, ponieważ to sprawia, że ​​konfiguracje są znacznie bardziej niesamowite. Robisz nginx + php-fpm dla swojego serwera WWW. Aby rozwiązać przesyłanie, użyj modułu przesyłania i modułu postępu przesyłania dla nginx. Oznacza to, że twój serwer akceptuje przesyłanie i po zakończeniu przekazuje ścieżkę pliku do PHP, dzięki czemu plik nie musi być przesyłany strumieniowo między nginx i PHP za pośrednictwem protokołu fastcgi, kochanie. (Mam to w konfiguracji na żywo i działa świetnie, btw!)

Do pobierania użytkownika używasz funkcji podobnej do x-send-file nginxs o nazwie x-accel-redirect, zasadniczo wykonujesz uwierzytelnianie w PHP i ustawiasz nagłówek, który nginx pobiera i rozpoczyna przesyłanie tego pliku. PHP kończy wykonywanie, a Twój serwer obsługuje przesyłanie, kochanie! (Znowu mam to w konfiguracji na żywo i działa świetnie)

W przypadku dystrybucji plików między serwerami lub innych długotrwałych operacji zdajemy sobie sprawę, że PHP nie najlepiej do tego nadaje, dlatego instalujemy gearman, który jest serwerem zadań, który może rozdzielać zadania między pracownikami na różnych serwerach, pracownicy ci mogą być zapisani w dowolnym język. Dlatego możesz utworzyć proces dystrybucji i spawnować 5 z nich, używając w sumie 200 KB pamięci zamiast 100 MB, których PHP użyłoby. Słodkie. (Mam też to na żywo, więc to wszystko jest możliwe)

Jeśli jeszcze tego nie zauważyłeś, myślę, że wiele twoich problemów nie jest w ogóle związanych z twoim serwerem WWW, po prostu myślisz w ten sposób, ponieważ Apache zmusza go do powiązania z twoim serwerem WWW ze względu na jego strukturę, często istnieją znacznie lepsze narzędzia do pracy niż PHP, a PHP to język, który o tym wie i zapewnia doskonałe opcje odciążania pracy bez opuszczania PHP.

Gorąco polecam nginx, ale myślę również, że powinieneś spojrzeć na inne opcje dla innych problemów, jeśli masz problem ze skalowaniem lub wydajnością, napisz do mnie. Nie wiem, czy możesz wysyłać wiadomości tutaj, ale w przeciwnym razie napisz do mnie na [email protected], ponieważ nie śledzę winy serwera za nic nie oznaczone tagiem nginx. :)

Martin Fjordvald
źródło
1
Cholera, która naprawdę wszystko wyjaśniła :) dzięki, że to było wyjaśnienie, którego szukałem. Myślę, że jestem całkiem sprzedany nauce Nginx teraz, ponieważ Apache dusiłby się i umierał z mojej strony. Na szczęście poruszanie się po nim wydaje się dość łatwe. Mam na myśli, że ludzie na node.js powiedzieli, że piszą w tym większość rzeczy i sondują klasę sesji php tylko wtedy, gdy naprawdę tego potrzebujesz (co robię, chyba że istnieje sposób na wykrycie, kiedy użytkownicy zamykają okna: P). Tak, pracuję na ogromnej farmie serwerów, więc wiedza, że ​​nie ma zagrożenia bezpieczeństwa, pomaga tonom, dzięki za świetne wyjaśnienie :)
Sammaye
Patrzyłem na to: joeandmotorboat.com/2008/02/28/... i to: blog.webfaction.com/a-little-holiday-present i naprawdę sprawiło, że żartowałem na myśl, że mogę długo ankieta do mych serc naprawdę. Ani jednego problemu z pamięcią w przeciwieństwie do Apache :)
Sammaye
Poczekaj, więc twoje powiedzenie, że mogę zrobić wielowątkowego pracownika w Javie, a PHP może go obejść? Mam na myśli największy problem, jaki widzę, to serwer, ponieważ mam ogromne problemy z pamięcią w Apache przy użyciu długiego odpytywania, co jest często ... często naprawiane przez Nginx.
Sammaye,
1
Zasadniczo tak, mam pracowników dystrybucji plików napisanych w C, używając rozszerzenia gearman dla PHP Wysyłam zadanie dystrybucji do serwera zadań gearman i wysyła je do pracownika, który może być napisany w dowolnym języku; PHP, Java, C itp. Następnie ten pracownik wykonuje swoją pracę i zgłasza status z powrotem do gearmana, który zgłasza się z powrotem do PHP. (chyba że wybrano zadanie w tle, w którym to przypadku PHP kończy się bez czekania na niego)
Martin Fjordvald
2
Wiem, że to stary post, ale muszę powiedzieć, że jest to jeden z najbardziej pouczających postów na temat Nginx kontra Apache. Niż Martin, +1.
Akoi Meexx
5

Sugerowałbym uruchomienie nginx jako odwrotnego proxy. Będzie obsługiwał wszystkie pliki statyczne i buforowane (tam, gdzie jest znacznie szybszy niż Apache / mniej pamięci), a następnie przekaże wszystkie żądania zawartości dynamicznej do Apache.

Greg Annandale
źródło
Tak, wydaje się, że większość ludzi robi to w bankomatach. Muszę się tym
zająć
1
Pamiętaj, aby zainstalować mod_rpaf dla Apache, abyś mógł przechodzić przez adresy IP klienta do celów logowania (w przeciwnym razie dzienniki Apache będą wyświetlać wszystkie żądania z wersji 127.0.0.1), dodaj następujące ustawienia do konfiguracji nginx: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale,
Zastanawiam się nad jedną rzeczą, zanim spróbuję tej nocy. Jeśli kieruję przez Nginx do Apache, który obsługuje mój PHP, czy to oznacza, że ​​długie odpytywanie nadal będzie miało takie same problemy jak Apache, czy też wywołanie go w odwrotnym proxy powoduje, że Apache zachowuje się inaczej?
Sammaye,
1

Nie jestem pewien, czy mod_php jest szybszy niż jego alternatywy, gdzie to przeczytałeś? Zrobiłem kilka testów laboratoryjnych z nginx + php-fpm, i z tego, co zmierzyłem, bije każda inna konfiguracja.

Spójrz na tę konfigurację: http://interfacelab.com/nginx-php-fpm-apc-awesome/

Skonfigurowałem go prawie tak samo, z tym wyjątkiem, że używam pakietów PHP z http://www.dotdeb.org/ - który zawiera pakiet php-fpm i gotowy skrypt init. Nie używam memecache ani syck.

Pauska
źródło
stackoverflow.com/questions/78108/... dostałem go stąd i sprawdziłem instrukcję php i mówi ona, że ​​php_mod zapewnia znaczną przewagę nad wersjami cgi. Twoja konfiguracja wygląda dobrze. Wygląda też bardzo łatwo.
Zajmę
2
Stwierdza, że ​​CGI jest znacznie wolniejszy niż wbudowany moduł - nie FastCGI :)
pauska
1
Cóż - jeśli martwisz się śmiercią procesorów PHP (lub przekroczeniem limitu czasu), to FastCGI (lub PHP-FPM) jest dobrym rozwiązaniem. Może zabijać martwe procesy dziecka bez przerywania innych czynności.
pauska
1
Tak. Lub, cóż, to zależy. Ile (maksymalna) liczba wolnych żądań będzie przetwarzana w tym samym czasie? Ustaw do tego maksimum wątków PHP FPM, a także liczbę „szybkich” cgi, które chcesz uzyskać. Słyszałem o ludziach korzystających z 200 dzieci PHP-FPM na serwerze z 4 GB pamięci RAM, więc nie martwiłbym się tym zbytnio, gdybym był tobą. Następna wersja PHP (5.3.3) będzie zawierała PHP-FPM w standardzie, w której znajduje się również silnik adpative - będzie skalowany zgodnie z liczbą oczekujących żądań.
pauska
1
Z łatwością działałbym na wielu serwerach (może do 10), ale gdybym mógł zmieścić 200 żądań, które można długo odpytywać na serwerze 4 GB, to prawie połowa z 20 serwerów wymagałaby uruchomienia Apache. hmmmm ... Będę musiał to dzisiaj
przetestować