2012-02-17 16 views
44

Używam jednego serwera do obsługi wielu aplikacji sieciowych Node.js, które są rozproszone w wielu domenach. Moja obecna praktyka polega na uruchomieniu serwera Express dla każdej aplikacji na innym porcie i uruchomieniu serwera bazowego, który po prostu kieruje (przekierowuje) żądania do właściwego portu/serwera Express. To działa, ale oznacza to, że mój serwer bazowy routuje każde pojedyncze żądanie HTTP (i ręcznie przekierowuje je) oraz że moi użytkownicy widzą moje aplikacje jako hostowane pod adresem [hostname.com]: 8000.Jak powinienem organizować wiele serwerów Express w tym samym systemie?

Po kilku badaniach odkryłem, że mogę korzystać z http-proxy dla potrzeb routingu, ale nadal chciałbym wiedzieć, czy istnieje najlepsza praktyka do uruchamiania wielu serwerów Express w tym samym systemie. Oto, jak zamierzam to zrobić:

Każda aplikacja internetowa będzie miała swój własny folder z pełną strukturą folderu Express (app.js, trasy, widoki itp.). Aplikacje będą pogrupowane według domen, więc struktura folderów przykładem 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żdy app.js osobno z węzła (lub z forever, który obecnie używam), a każdy z nich będzie musiał użyć innego portu wewnętrznie , przy czym przekierowania między aplikacjami są wskazywane na port docelowej aplikacji.

To mój obecny plan. Jakie są z tym problemy i jakich pułapek powinienem unikać? Co najważniejsze, jest ustalonym rozwiązaniem tego problemu - problemem hostowania wielu aplikacji internetowych w tym samym systemie za pomocą Node.js/Express?

EDYCJA: Mam zamiar ostatecznie korzystać z WebSockets i HTTPS, a ilość przepustowości, którą moja konfiguracja może obsłużyć, ma dla mnie niewielkie znaczenie - 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 decyduję się na ogólną strukturę dla mojej aplikacji i wygląda na to, że pytanie to jest szczegółowo omówione przez: this StackOverflow question

TRZECIA EDYCJA: Od czasu opublikowania tego pytania przeszedłem kilka sposobów (choć mam znacznie więcej do udać się). Sprawdź numer this file in my GitHub repository, który wykorzystuje to, czego dowiedziałem się z odpowiedzi na to pytanie!

Odpowiedz

35

Ponieważ Express używa numeru Connect, jestem pewien, że możesz użyć oprogramowania pośredniczącego wirtualnego hosta Connect. Działa podobnie do innych modułów vhost na innych produktach. Nie mam wiele domen do testowania i pokazać właściwy kod, ale myślę, że jest 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 jest wystarczająco, a następnie spójrz w użyciu Węzeł.Klaster z interfejsu API. Jeśli to również nie wystarczy, obecna praktyka polega na umieszczeniu asynchronicznego odwrotnego proxy, takiego jak Nginx przed Twoimi serwerami Express i skierowaniu serwerów proxy do serwerów Express.

+0

Dzięki za komentarz. Zacząłem używać vhost (z pomocą kilku użytecznych użytkowników IRC w #express) i działa to jak czar. Dziękuję także za możliwość przeniesienia się do Node.Cluster. – Aaron

+2

@aaron Proszę bardzo. Do zobaczenia na IRC, może – EhevuTov

+0

@Aaron Czy masz jakiś kod, który możesz udostępnić, aby pokazać nam, jak to robisz? – Matt

6

Jeśli nie potrzebujesz korzystać z WebSockets (lub jakiejkolwiek funkcji HTTP 1.1, naprawdę), you can use NginX as your proxy instead.

Zaletą jest całkowite obciążenie, z jakim NginX może sobie poradzić w porównaniu do węzła, jest wyższa (w zasadzie statycznie skompilowana i specjalistyczna do tego typu rzeczy), ale traci się możliwość przesyłania strumieniowego dowolnych danych (wysyłanie mniejszych porcji jednocześnie).

W przypadku mniejszej witryny lub jeśli nie masz pewności, jakie funkcje będziesz potrzebować w przyszłości, prawdopodobnie lepiej będzie trzymać się z numerem node-http-proxy i przełączać się tylko na NginX, jeśli możesz wykazać, że serwer proxy jest wąskim gardłem. Na szczęście NginX nie jest trudny do skonfigurowania, jeśli będziesz go później potrzebować.

+0

Mam zamiar ostatecznie wykorzystać WebSockets i HTTPS, a ilość przepustowości, którą moja konfiguracja może obsłużyć, ma dla mnie niewielkie znaczenie - jest to serwer programistyczny (przynajmniej na razie). Dziękujemy za poruszenie kwestii WebSockets. Jednak moje pytanie dotyczy organizacji mojego systemu jeden krok wstecz po serwerze proxy odwrotnego - w jaki sposób skonfigurować i zorganizować serwery Express dla wielu aplikacji internetowych? – Aaron

+0

Powiedziałbym, że Node.js jest wystarczająco młody, że nie ma * ustanowionego * wzorca dla wielu aplikacji Express na tym samym serwerze. Node.js ma więcej wspólnego z Tomcat/Getty i innymi serwerami WWW opartymi na Javie; jedna aplikacja na serwer, podczas gdy hostowanie wielu stron internetowych tradycyjnie odbywało się za pomocą jednego serwera WWW (Apache/NginX/Lighttpd/etc). Każda aplikacja internetowa Node.js musi być tak skonfigurowana, aby nie używać portu TCP używanego przez inną aplikację internetową, więc nie ma metody "przeciągnij i upuść", aby ją skonfigurować. –

+2

Aby dodać, że serwer HTTP Node.js można skonfigurować do nasłuchu na porcie [tylko dla określonej nazwy hosta] (http://nodejs.org/docs/v0.6.10/api/http.html# server.listen), możesz * mieć * wszystko skonfigurowane jako jeden proces Node.js z jednoczesnym uruchamianiem wielu serwerów Express. Oczywiście nie ma sensu, gdy serwery te nigdy nie dotykają kodu między sobą, a narzut procesu Node.js to tylko garść megabajtów, ale jest to również "opcja". –

Powiązane problemy