Świetne pytanie!
Istnieje wiele stron internetowych i darmowych aplikacji internetowych zaimplementowanych w PHP, które działają na Apache, wiele osób korzysta z niego, dzięki czemu można zmiksować coś całkiem łatwego, a poza tym jest to bezproblemowy sposób dostarczania treści statycznych. Węzeł jest szybkim, potężnym, eleganckim i seksownym narzędziem o surowej mocy V8 i płaskim stosie bez wbudowanych zależności.
Chcę także łatwości / elastyczności Apache, a jednocześnie chrząknięcia i elegancji Node.JS, dlaczego nie mogę mieć obu ?
Na szczęście dzięki dyrektywie ProxyPass w Apache httpd.conf
przesyłanie wszystkich żądań pod określonym adresem URL do aplikacji Node.JS nie jest zbyt trudne.
ProxyPass /node http://localhost:8000
Upewnij się również, że następujące wiersze NIE są komentowane, aby uzyskać odpowiedni serwer proxy i submoduł do przekierowywania żądań http:
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Następnie uruchom aplikację Node na porcie 8000!
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Apache!\n');
}).listen(8000, '127.0.0.1');
Następnie możesz uzyskać dostęp do całej logiki Node.JS przy użyciu /node/
ścieżki w adresie URL, resztę strony można pozostawić Apache, aby hostowała istniejące strony PHP:
Teraz jedyne, co pozostało, to przekonanie firmy hostingowej, aby pozwoliła Ci uruchomić tę konfigurację !!!
mod_proxy_wstunnel
. Widzę, że znalazłeś już swoją odpowiedź. W przypadku innych osób mających ten sam problem odwiedź stronę: serverfault.com/questions/616370/…To pytanie należy bardziej do błędu serwera, ale FWIW powiedziałbym, że uruchomienie Apache przed Node.js nie jest dobrym podejściem w większości przypadków.
ProxyPass firmy Apache jest niesamowity do wielu rzeczy (takich jak udostępnianie usług opartych na Tomcat jako część witryny) i jeśli twoja aplikacja Node.js wykonuje określoną, niewielką rolę lub jest narzędziem wewnętrznym, które może mieć tylko ograniczoną liczbę użytkowników wtedy może być łatwiej po prostu go użyć, abyś mógł go uruchomić i przejść dalej, ale to nie wygląda tak jak tutaj.
Jeśli chcesz skorzystać z wydajności i skali, jaką uzyskasz przy użyciu Node.js - a zwłaszcza jeśli chcesz użyć czegoś, co wymaga utrzymywania trwałego połączenia, takiego jak gniazda sieciowe - lepiej jest uruchomić zarówno Apache, jak i swój Węzeł. js na innych portach (np. Apache na localhost: 8080, Node.js na localhost: 3000), a następnie uruchamiając coś takiego jak nginx, Varnish lub HA proxy z przodu - i przekierowując ruch w ten sposób.
Za pomocą czegoś takiego jak lakier lub nginx możesz kierować ruchem na podstawie ścieżki i / lub hosta. Oba zużywają znacznie mniej zasobów systemowych i są znacznie bardziej skalowalne niż używanie Apache do tego samego.
źródło
Instrukcje do uruchomienia
node server
wzdłużapache2(v2.4.xx) server
:W celu rury wszystkie żądania dotyczące konkretnego adresu URL do aplikacji node.js utworzyć
CUSTOM.conf
plik w/etc/apache2/conf-available
katalogu i dodać następujący wiersz do utworzonego pliku:Zmień 8000 na preferowany numer portu dla
node server
.Włącz niestandardowe konfiguracje za pomocą następującego polecenia:
CUSTOM to nowo utworzona nazwa pliku bez rozszerzenia, a następnie włącz
proxy_http
za pomocą polecenia:powinna umożliwić zarówno
proxy
iproxy_http
modułów. Możesz sprawdzić, czy moduł jest włączony, czy nie:Po włączeniu konfiguracji i modułów konieczne będzie zrestartowanie serwera Apache:
Teraz możesz uruchomić serwer węzła. Wszystkie żądania do
URL/node
będą obsługiwane przez serwer węzła.źródło
Uruchamianie Node i Apache na jednym serwerze jest banalne, ponieważ nie powodują konfliktów. NodeJS to tylko sposób na uruchomienie strony JavaScript. Prawdziwy dylemat wynika z dostępu zarówno do Węzła, jak i Apache z zewnątrz. Widzę, że masz dwie możliwości:
Skonfiguruj Apache do proxy wszystkich pasujących żądań do NodeJS, które wykonają przesyłanie plików i cokolwiek innego w węźle.
Posiadaj Apache i Węzeł na różnych kombinacjach adresów IP: port (jeśli twój serwer ma dwa adresy IP, jeden może być powiązany z odbiornikiem węzła, drugi z Apache).
Zaczynam też podejrzewać, że to może nie być to, czego tak naprawdę szukasz. Jeśli Twoim ostatecznym celem jest napisanie logiki aplikacji w Nodejs i części „obsługi plików”, którą odciążysz kontrahenta, to naprawdę jest to wybór języka, a nie serwer WWW.
źródło
Możesz zastosować inne podejście, np. Napisać odwrotny serwer proxy z nodejs do proxy zarówno apache, jak i wszystkich innych aplikacji nodejs.
Najpierw musisz uruchomić apache na innym porcie niż port 80. np .: port 8080
Następnie możesz napisać skrypt odwrotnego proxy za pomocą nodejs jako:
Poniższy artykuł opisuje cały proces tworzenia tego.
URUCHOM APACHE Z NODE JS PROXY ODWRÓCONY - ZA POMOCĄ REDBIRD
źródło
źródło
Połączyłem powyższą odpowiedź z certbot SSL cert i CORS kontrola dostępu-zezwól-nagłówki i sprawiłem, że działało, więc pomyślałem, że podzielę się wynikami.
Apache httpd.conf dodano na dole pliku:
Ustawienia VirtualHost Apache (katalog główny dla PHP znajduje się w Apache i SSL z Certbot, podczas gdy witryna node.js / socket.io działa na porcie 3000 - i używa certyfikatu SSL z Apache). Należy również zauważyć, że witryna node.js używa proxy dla folderu / nodejs, socket.io i ws (websockets):
Następnie moja aplikacja node.js (app.js):
Wymuszam słuchanie ip4, ale jest to opcjonalne - możesz zastąpić:
Kod aplikacji node.js (app.js) kontynuuje:
wreszcie po stronie klienta (utworzony jako nodejs.js):
W tym przykładzie po załadowaniu JS wyśle do gniazda „nazwane zdarzenie” wysyłające dane w JSON do serwera node.js / socket.io.
Używając io i socket na serwerze pod path / nodejs (połączonym przez klienta), odbiera dane, a następnie wysyła je ponownie jako transmisję. Każdy inny użytkownik w gnieździe odbierałby dane ze swoim odbiornikiem „named-event-broadcast”. Pamiętaj, że nadawca nie odbiera własnej transmisji.
źródło
Niedawno natknąłem się na ten problem, w którym muszę komunikować się między klientem a serwerem przy użyciu websocket w projekcie kodu opartego na PHP.
Rozwiązałem ten problem, dodając mój port (uruchomiona aplikacja węzła) do
Allow incoming TCP ports
&Allow outgoing TCP ports
list.Możesz znaleźć te konfiguracje w
Firewall Configurations
panelu WHM swojego serwera.źródło
Szukałem tych samych informacji. W końcu znalazłem odpowiedź z linku na powyższej odpowiedzi autorstwa @Straseus
http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/
Oto ostatnie rozwiązanie do uruchomienia strony Apache na porcie 80, usługi węzła JS na porcie 8080 i użycia .htaccess RewriteRule
W DocumentRoot witryny apache dodaj następujące elementy:
W przypadku przekierowania na poziomie katalogu powyższy link sugeruje regułę (. +), Która wymaga jednego lub więcej znaków po „węźle /”. Musiałem przekonwertować go na (. *), Który wynosi zero lub więcej, aby moje rzeczy działały.
Wielkie dzięki za link @Straseus
źródło
mod_proxy
włączenia Apache .ProxyPass
?Zakładam, że tworzysz aplikację internetową, ponieważ odwołujesz się do Apache i Node. Szybka odpowiedź - Czy to możliwe - TAK. Czy to jest zalecane - NIE. Węzeł zawiera własny serwer WWW, a większość stron internetowych działa na porcie 80. Zakładam również, że obecnie nie ma wtyczki Apache obsługiwanej przez Nodejs i nie jestem pewien, czy stworzenie wirtualnego hosta jest najlepszym sposobem na wdrożenie tego. Na te pytania powinni odpowiedzieć programiści, którzy utrzymują Nodejsa jak dobrych ludzi w Joyent.
Zamiast portów lepiej byłoby ocenić stos technologiczny Node, który jest zupełnie inny niż większość innych i dlatego go uwielbiam, ale wymaga również kilku kompromisów, o których powinieneś wiedzieć wcześniej.
Twój przykład wygląda podobnie do CMS lub udostępniającej aplikacji internetowej. Istnieją setki gotowych aplikacji, które będą działać dobrze na Apache. Nawet jeśli nie podoba Ci się żadne gotowe rozwiązanie, możesz napisać aplikację internetową w PHP / Java / Python lub połączyć ją z kilkoma gotowymi aplikacjami, a wszystkie one są zaprojektowane i obsługiwane tak, aby działały za jedną instancją Apache.
Czas się zatrzymać i pomyśleć o tym, co właśnie powiedziałem.
Teraz możesz zdecydować, którego zestawu technologii będziesz używać. Jeśli Twoja witryna nigdy nie będzie używać żadnej z tysięcy gotowych aplikacji wymagających Apache, wybierz Node, w przeciwnym razie musisz najpierw wyeliminować założenia, które przedstawiłem wcześniej.
Ostatecznie wybór technologii stosu jest o wiele ważniejszy niż jakikolwiek pojedynczy element.
Całkowicie zgadzam się z @Straseus, że używanie interfejsu API systemu plików node.js do obsługi przesyłania i pobierania jest stosunkowo proste, ale na dłuższą metę pomyśl więcej o tym, czego chcesz od strony internetowej, a następnie wybierz swój pakiet technologii.
Uczenie się frameworka Node jest łatwiejsze niż uczenie się innych frameworków, ale nie jest to panaceum. Przy odrobinie wysiłku (co może być samo w sobie warte zachodu) możesz nauczyć się także innych ram. Wszyscy uczymy się od siebie i będziesz bardziej produktywny, jeśli pracujesz jako mały zespół, niż jeśli pracujesz sam, a umiejętności techniczne zaplecza również będą się rozwijać szybciej. Dlatego nie obniżaj tak tanio umiejętności innych członków swojego zespołu.
Ten post ma około roku i są szanse, że już zdecydowałeś, ale mam nadzieję, że mój rant pomoże kolejnej osobie, która podejmie podobną decyzję.
Dziękuje za przeczytanie.
źródło