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!

Author: Community, 2012-02-17

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.

 35
Author: EhevuTov,
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.

 6
Author: David Ellis,
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