2012-02-17 2 views
44

하나의 서버를 사용하여 여러 도메인에 분산되어있는 여러 Node.js 웹 앱을 호스팅하고 있습니다. 나의 현재 실습은 다른 포트의 각 응용 프로그램에 대해 Express 서버를 실행하고 요청을 올바른 포트/Express 서버로 라우팅 (리디렉션)하는 기본 서버를 실행하는 것입니다. 이 기능은 작동하지만 내 기본 서버가 모든 HTTP 요청을 라우팅 (수동으로 리디렉션)하고 내 사용자가 [hostname.com] : 8000에서 호스트 된 것으로 내 애플리케이션을 볼 수 있음을 의미합니다.같은 시스템에 여러 대의 Express 서버를 구성하는 방법은 무엇입니까?

약간의 연구 끝에 필자는 내 라우팅 요구에 http-proxy을 사용할 수 있지만 동일한 시스템에서 여러 대의 Express 서버를 실행하는 것이 가장 좋은 방법인지 알고 싶습니다. 다음과 같이 계획하고 있습니다.

각 웹 앱에는 완전한 Express 폴더 구조 (app.js, 경로,보기 등)가있는 고유 한 폴더가 있습니다. 도메인별로 앱이 ​​그룹화되므로 예를 들어, 폴더 구조는 다음과 같습니다

hostname.com/ 
     app.js 
     routes/ 
     views/ 
     ... 
     app1/ 
      app1.js 
      routes/ 
      views/ 
      ... 
     app2 
     ... 
    hostname2.com/ 
     app.js 
     routes/ 
     views/ 
     ... 

내가 노드와 별도로 각 app.js를 실행해야합니다 (또는 내가 현재 사용하고 forever와 함께), 그리고 각각 내부적으로 다른 포트를 사용해야합니다 , 교차 앱 리디렉션이 대상 앱의 포트를 가리키고 있습니다.

이것이 현재의 계획입니다. 그 문제는 무엇이며 어떤 함정을 피해야합니까? 가장 중요한 점은 이이 문제에 대한 확고한 해결책 인 Node.js/Express를 사용하여 동일한 시스템에 여러 웹 응용 프로그램을 호스팅하는 문제입니까?

EDIT : 결국 웹 소켓과 HTTPS를 사용할 계획이며, 설치 프로그램에서 지원할 수있는 대역폭의 양은 거의 중요하지 않습니다. 이것은 개발 서버입니다 (적어도 현재는). WebSockets 문제를 제기 한 David Ellis에게 감사드립니다.

두 번째 편집 : EhevuTov와 David Ellis에게 감사의 말을 전합니다. 나는 아직도 내 응용 프로그램에 대한 전체 구조에 정착하고있어, 그 질문은 this StackOverflow question에 의해 몇 가지 세부에서 해결 된 것처럼이

이 이

THIRD 편집 보인다 : 나는 훨씬 더해야하지만 (이 질문을 게시 이후 방법을 왔어요 가기). this file in my GitHub repository을 확인하십시오.이 질문에 대한 답변에서 내가 배운 것을 활용하십시오!

답변

35

Express는 Connect을 사용하므로 Connect의 가상 호스트 미들웨어를 사용할 수 있습니다. 다른 제품의 다른 vhost 모듈과 비슷하게 작동합니다. 내가 테스트하고 당신에게 적절한 코드를 표시하는 여러 도메인을 가지고 있지 않지만, 나는 이런 식으로 뭔가 생각 것입니다 : 한 Express 서버가 충분하지 않습니다 지점에 도착하면

express.createServer() 
.use(express.vhost('hostname1.com', require('/path/to/hostname1').app) 
.use(express.vhost('hostname2.com', require('/path/to/hostname2').app) 
.listen(80) 

후 사용 조사 Node.API의 클러스터. 이것도 충분하지 않다면 현재는 익스프레스 서버 앞에 Nginx와 같은 asnyc 리버스 프록시를두고 익스프레스 서버로 프록시를 지정합니다.

+0

코멘트 주셔서 감사합니다. vhost (#express에서 유용한 IRC 사용자의 도움을 받아)를 사용하기 시작했으며, 매력처럼 작동합니다. 또한 Node.Cluster로 이동할 가능성을 높이 평가 해 주셔서 감사합니다. – Aaron

+2

@aaron 대단히 환영합니다. IRC에서 어쩌면 – EhevuTov

+0

@Aaron에서 보자. 어떻게 할 수 있는지 보여주기 위해 공유 할 수있는 코드가 있습니까? – Matt

6

웹 소켓 (또는 HTTP 1.1 기능을 실제로 사용할 필요가없는 경우) you can use NginX as your proxy instead.

이점은 NginX가 처리 할 수있는 총로드가 Node보다 높다는 것입니다 (기본적으로 정적으로 컴파일되고 특수화되는 것입니다). 그러나 한 번에 작은 덩어리를 보내는 모든 데이터를 스트리밍 할 수있는 능력을 잃게됩니다.

작은 사이트의 경우 또는 앞으로 필요한 기능이 확실하지 않은 경우 node-http-proxy을 계속 사용하고 프록시가 서버의 병목임을 입증 할 수 있다면 NginX로 전환하는 것이 좋습니다. 다행히 NginX는 나중에 필요할 경우 설정하기가 어렵지 않습니다.

+0

웹 소켓과 HTTPS를 사용할 계획입니다. 설치 프로그램에서 지원할 수있는 대역폭의 양은별로 중요하지 않습니다. 이것은 개발 서버입니다 (적어도 현재는). WebSockets 문제를 제기 해 주셔서 감사합니다. 그러나 내 질문은 내 시스템의 한 단계에 대한 것입니다 _after_ reverse proxy server - 여러 웹 응용 프로그램에 대해 Express 서버를 설정하고 구성해야합니까? – Aaron

+0

Node.js가 젊어서 같은 서버에 여러 개의 Express 응용 프로그램에 대해 * 설정된 * 패턴이 없다고 말할 수 있습니다. Node.js는 Tomcat/Getty 및 기타 Java 기반 웹 서버와 더 많이 공유합니다. 서버 당 하나의 응용 프로그램, 여러 웹 사이트 호스팅은 전통적으로 단일 웹 서버 (Apache/NginX/Lighttpd/등)로 수행되었습니다. 각 Node.js 웹 애플리케이션은 다른 웹 애플리케이션에서 사용하는 TCP 포트를 사용하지 않도록 구성해야하므로 설정하기위한 "드래그 앤 드롭"방식이 없습니다. –

+2

Node.js HTTP 서버가 [특정 호스트 이름에 대해서만] 포트에서 수신 대기하도록 설정할 수 있기 때문에 추가 할 수 있습니다 (http://nodejs.org/docs/v0.6.10/api/http.html# server.listen)를 사용하면 모든 Express 서버를 동시에 실행하는 Node.js 프로세스로 모든 것을 설정할 수 있습니다. 물론 이들 서버가 서로간에 코드를 접하지 않고 Node.js 프로세스 오버 헤드가 단 몇 메가 바이트에 불과하지만 "선택 사항"이기도합니다. –

관련 문제