Jak zorganizować wiele serwerów Express W tym samym systemie?
Używam jednego serwera do hostowania wielu węzłów.aplikacje internetowe js, które są dystrybuowane w wielu domenach. Moją obecną praktyką jest uruchamianie serwera Express dla każdej aplikacji na innym porcie i uruchamianie serwera bazowego, który po prostu przekierowuje żądania do właściwego portu / serwera Express. To działa, ale oznacza to, że mój serwer bazowy przekierowuje każde żądanie HTTP (i ręcznie je przekierowuje), a moi użytkownicy widzą moje aplikacje jako hostowane w [hostname.com]: 8000.
Po odrobinie z badań odkryłem, że mogę używać HTTP-proxy do moich potrzeb routingu, ale nadal chciałbym wiedzieć, czy istnieje najlepsza praktyka uruchamiania wielu serwerów Express na tym samym systemie. Oto jak planuję to zrobić:
Każda aplikacja internetowa będzie miała swój własny folder, z kompletną strukturą folderów Express (app.js, trasy, widoki itp.) Aplikacje będą pogrupowane według domen, więc przykładowa struktura folderów będzie:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
Będę musiał uruchomić każdą aplikację.js oddzielnie z węzłem (lub z forever, którego obecnie używam), a każdy z nich będzie musiał użyć innego portu wewnętrznie, a przekierowania między aplikacjami będą wskazywane na port docelowej aplikacji.
To mój obecny plan. Jakie są z nim problemy i jakich pułapek powinienem unikać?
Co najważniejsze, czy istnieje ustalone rozwiązanie tego problemu - problem hostowania wielu aplikacji internetowych na tym samym systemie z węzłem.js / Express?
EDIT: planuję w końcu użyj WebSockets i HTTPS, a ilość przepustowości, którą może obsługiwać moja konfiguracja, nie ma dla mnie większego znaczenia - jest to serwer programistyczny (przynajmniej na razie). Podziękowania dla Davida Ellisa za poruszenie kwestii WebSockets.
Druga edycja: podziękowania dla Ehevutova i Davida Ellisa za odpowiedzi, które bardzo pomogły. Nadal ustalam ogólną strukturę mojej aplikacji i wygląda na to, że to pytanie jest rozwiązane w niektórych szczegółach przez ten StackOverflow pytanie
Trzeci EDIT: trochę przeszedłem od zamieszczenia tego pytania (choć mam jeszcze wiele do zrobienia). Sprawdź ten plik w moim repozytorium GitHub , który wykorzystuje to, czego nauczyłem się z odpowiedzi na to pytanie!
2 answers
Ponieważ Express używa Connect , jestem prawie pewien, że możesz użyć wirtualnego oprogramowania pośredniczącego Connect. Działa podobnie do innych modułów vhost na innych produktach. Nie mam wielu domen do przetestowania i pokazania odpowiedniego kodu, ale myślę, że to coś takiego:
express.createServer()
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app)
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app)
.listen(80)
Jeśli dojdziesz do punktu, w którym jeden Serwer Express nie wystarczy, spójrz na korzystanie z węzła.Klaster z API. Jeśli to również nie wystarczy, to obecna praktyka polega na umieszczeniu asnyc reverse proxy takich jak Nginx przed Twoimi serwerami Express i skieruj proxy na twoje serwery Express.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-06 17:06:54
Jeśli nie musisz używać WebSockets (ani żadnej funkcji HTTP 1.1), możesz użyć Nginx jako proxy zamiast.
Zaletą jest to, że całkowite obciążenie nginx może obsłużyć w porównaniu z węzłem jest wyższe( statycznie skompilowane i wyspecjalizowane do tego rodzaju rzeczy, w zasadzie), ale tracisz możliwość przesyłania strumieniowego dowolnych danych (wysyłanie mniejszych kawałków na raz).
W przypadku mniejszej witryny lub jeśli nie masz pewności, jakich funkcji będziesz potrzebować w przyszłości, prawdopodobnie lepiej trzymać się node-http-proxy
i przełącz się na NginX tylko wtedy, gdy możesz wykazać, że proxy jest wąskim gardłem na twoim serwerze. Na szczęście NginX nie jest trudny do skonfigurowania, jeśli potrzebujesz go później.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-17 19:10:56