Czy mogę zamienić Apache na Node.js?

151

Mam stronę internetową działającą na CentOS i używającą zwykłych podejrzanych (Apache, MySQL i PHP). Od czasu, gdy ta witryna została pierwotnie uruchomiona, bardzo się rozwinęła i teraz chciałbym robić z nią bardziej wyszukane rzeczy - mianowicie powiadomienia w czasie rzeczywistym. Z tego, co przeczytałem, Apache radzi sobie z tym słabo. Zastanawiam się, czy mogę zamienić tylko Apache na Node.js (więc zamiast " LAMP " będzie to "LNMP").

Próbowałem wyszukać w Internecie rozwiązanie, ale go nie znalazłem. Jeśli poprawnie interpretuję rzeczy, które przeczytałem, wydaje się, że większość ludzi twierdzi, że Node.js może zastąpić jednocześnie Apache i PHP. Mam jednak dużo istniejącego kodu PHP, więc wolałbym go zachować.

Jeśli nie jest to już oczywiste, jestem dość zdezorientowany i przydałoby mi się trochę oświecenia. Dziękuję bardzo!

Stóg
źródło
Warto przyjrzeć się serwerowi Ape.
TryHarder

Odpowiedzi:

86

Jeśli jesteś gotowy, aby ponownie napisać PHP w JavaScript, to tak, Node.js może zastąpić twój Apache.

Jeśli umieścisz instancję Apache lub NGINX działającą w trybie odwrotnego proxy między swoimi serwerami a klientami, możesz obsłużyć niektóre żądania w JavaScript na Node.js i niektóre żądania w PHP hostowanym przez Apache, aż do całkowitego zastąpienia całego PHP z kodem JavaScript. To może być przyjemne medium: wykonuj swoje WebSockets w Node.js, bardziej przyziemną pracę w Apache + PHP.

sarnold
źródło
1
Doceniam szybką odpowiedź! Czy Nginx znacznie przewyższa Apache? Mam już plik .htaccess i byłoby miło go zachować. Czytałem też, że wysyłanie żądań Apache do Node.js nie ma sensu, ponieważ wtedy tracisz zalety Node.js, ponieważ nadal korzystasz z Apache. Czy nie byłoby lepiej, gdyby Node.js nasłuchiwał na porcie 80 czegokolwiek w podfolderze o nazwie „nodejs”, a potem wszystko, czego nie ma w tym podfolderze, mogłoby zostać przesłane do Apache przez Node.js? Apache mógł nasłuchiwać na innym porcie, takim jak 8000.
Rick
21
@Rick, jestem blisko usunięcia własnej odpowiedzi; Węzeł może używaćsendfile i istnieje moduł obsługujący FastCGI, który może ułatwić obsługę PHP również przez Node. Jeśli chodzi o nginx vs Apache, zawsze byłem frajerem serwerów asynchronicznych na serwerach wielowątkowych lub wieloprocesowych :), ale uważam, że dokumentację Apache łatwiej znaleźć i przeczytać. Nazwałbym to osobistymi preferencjami, chyba że potrzebujesz skalować do niesamowitych liczb. :)
sarnold
3
@Rick Nie chcesz migrować produkcji do Node, zanim nie zrozumiesz, co to jest i jak działa. Węzeł nie jest magiczną pigułką, która przyspiesza działanie. Paradygmat sterowany zdarzeniami / asynchroniczny nie jest nowy i istnieją powody, dla których nie jest używany do wszystkiego. en.wikipedia.org/wiki/Asynchronous_I/O
Øyvind Skaar
1
@Rick Zamiast myśleć, że powinieneś wymienić to, co masz, może lepiej będzie dodatkowo uruchomić Node. Nie myśl, że jest jakikolwiek powód, aby przepuszczać wszystko przez node (?), Brzmi to jak zły pomysł. Po prostu uruchom węzeł na innym porcie lub hoście.
Øyvind Skaar,
2
@ Øyvind Skaar zgadzam się. Ponadto w przypadku większości witryn internetowych (na przykład Wordpress) prawdziwym wąskim gardłem jest baza danych, a nie dostęp do plików. A jeśli dostęp do pliku jest problemem, pamięć podręczna jest zawsze realnym rozwiązaniem. W każdym razie, jeśli chodzi o rzeczywistą wydajność, PHP-APC to cholernie tania sztuczka.
magallanes
26

Node.js może być szybszy niż Apache dzięki swojej architekturze zdarzeniowej / nieblokującej, ale możesz mieć problemy ze znalezieniem modułów / bibliotek, które zastępują część funkcjonalności Apache.

Sam Node.js jest lekkim, niskopoziomowym frameworkiem, który umożliwia stosunkowo szybkie tworzenie elementów po stronie serwera i części aplikacji internetowych w czasie rzeczywistym, ale Apache oferuje znacznie szersze opcje konfiguracji i „klasyczne” funkcje zorientowane na serwer WWW.

Powiedziałbym, że jeśli nie chcesz zamienić PHP na framework aplikacji internetowych oparty na node.js, taki jak express.js, powinieneś pozostać przy Apache (lub pomyśleć o migracji do Nginx, jeśli masz problemy z wydajnością).

yojimbo87
źródło
11

Uważam, że Node.js to przyszłość w obsłudze sieci, ale jeśli masz dużo istniejącego kodu PHP, najlepszym rozwiązaniem jest Apache / MySQL. Apache można skonfigurować do wysyłania żądań proxy do Node.js lub Node.js do wysyłania żądań proxy do Apache, ale uważam, że w obu przypadkach następuje utrata wydajności, szczególnie w pierwszym. Nie jest to jednak wielka sprawa, jeśli nie prowadzisz witryny o bardzo dużym ruchu.

Właśnie zarejestrowałem się w stackoverflow i nie mogę jeszcze komentować zaakceptowanej odpowiedzi, ale dzisiaj stworzyłem prosty skrypt Node.js, który faktycznie używa sendfile () do obsługi plików przez protokół HTTP. (Istniejący przykład, do którego odnosi się zaakceptowana odpowiedź, wykorzystuje tylko protokół TCP do wysłania pliku, a nie mogłem znaleźć przykładu dla HTTP, więc napisałem go sam.)

Pomyślałem więc, że ktoś może uznać to za przydatne. Udostępnianie plików przez wywołanie sendfile () systemu operacyjnego niekoniecznie jest szybsze niż w przypadku kopiowania danych przez „obszar użytkownika”, ale w rezultacie zużywa mniej procesora i pamięci RAM, dzięki czemu jest w stanie obsłużyć większą liczbę połączeń niż w klasyczny sposób.

Link: https://gist.github.com/1350901

youurayy
źródło
2
Chociaż to prawda, nadal uważam, że jeśli pozbędziesz się apache'a, zrób dokładnie to, co opisujesz, działałby tak szybko, a jeśli nie, szybciej niż node.js. Apache robi wiele rzeczy, których ludzie nie widzą lub naprawdę nie rozumieją, a jeśli dodasz całą funkcjonalność tych serwerów internetowych do node.js, będzie działał równie wolno jak one. Prostym przykładem byłby prawdopodobnie mynode.js / getfile? File = / etc / shadow
Rahly
8

Poprzedni SO post opisujący dokładnie to, co mówię (php + socket.io + węzeł)

Myślę, że możesz umieścić serwer węzłowy na jakimś hoście: 8000 z socket.io i włożyć kod klienta socket.io do tagów i przy minimalnym nakładzie pracy sprawić, by Twoja istniejąca aplikacja kołysała się z socket.io (dziecko czasu rzeczywistego) bez mnóstwa pracy.

Chociaż węzeł może być jedynym serwerem zaplecza, pamiętaj, że węzeł lubi żyć zgodnie ze swoją nazwą i stać się węzłem. Niedawno obejrzałem rozmowę, którą Ryan Dahl dał grupie użytkowników PHP i wspomniał o nazwie node odnoszącej się do wizji kilku procesów węzłów wykonujących pracę i rozmawiających ze sobą.

Richard Holland
źródło
2

Jego LAMP w porównaniu z MEAN w dzisiejszych czasach. Aby zapoznać się z bezpośrednim porównaniem, zobacz http://tamas.io/what-is-the-mean-stack .

Oczywiście M, E i A są nieco zmienne. Na przykład nowsza koa może zastąpić (E) xpress.

Jednak samo zastąpienie Apache'a Node.js prawdopodobnie nie jest właściwym sposobem na zmodernizowanie stosu internetowego.

Wolfgang Kuehn
źródło