2012-05-28 3 views
15

루트 페이지가 여러 개의 node.js 프로젝트로 실행 중입니다. 이들은 자신의 프로세스와 디렉토리에서 개별적으로 실행되어야합니다. 이 파일 구조를 고려여러 개의 node.js HTTP 프로세스 중 하나의 포트 공유

/home 
+-- /node 
    +-- /someProject  | www.some-project.com 
    | +-- index.js 
    | +-- anotherFile.img 
    | +-- ... 
    +-- /anotherProject | www.another-project.com 
    | +-- /stuff 
    | +-- index.js 
    | +-- ... 
    +-- /myWebsite  | www.my-website.com 
    | +-- /static 
    | +-- index.js 
    | +-- ... 
    +-- ...    | ... 

각하는 index.js는 부모 폴더 (someProject, anotherProject 등)의 세트와 cwd 개별 프로세스로 시작한다.

ov vHosts를 생각하십시오. 각 프로젝트는 자체 도메인에서 수신 대기하는 웹 서버를 시작합니다. 그리고 문제가 있습니다. 이후로는 하나의 스크립트 만 시작할 수 있습니다. 모두 80 번 포트에 바인딩하려고합니다. node.js API를 방문하여 가능한 해결책을 찾았습니다 : child_process.fork().

슬프게도 이것은 잘 작동하지 않습니다. 서버 인스턴스를 마스터 프로세스 (나중에 요청을 내 보냅니다) 또는 requestresponse의 객체를 consive에 전달하려고 할 때 오류가 발생합니다. 이는 node.js가 내부적으로 이러한 고급 객체를 JSON 문자열로 변환 한 다음 원래 형식으로 다시 변환하기 때문입니다. 이렇게하면 모든 객체가 참조 및 기능을 잃어 버리게됩니다.

두번째 버텍스 접근 child.js

var http = require("http"); 

var server = http.createServer(function(req, res) { 
    // stuff... 
}); 
server.listen(80); 

process.send(server); // Nope 

첫 번째 방법 master.js

var http = require("http"), 
    cp = require("child_process"); 

var child = cp.fork("/home/node/someProject/index.js", [], { env: "/home/node/someProject" }); 

var router = http.createServer(function(req, res) { 
    // domaincheck, etc... 
    child.send({ request: req, response: res }); // Nope 
}); 
router.listen(80); 

그래서이 막 다른 골목이다. 그러나, 헤이! Node.js는 전송 가능한 핸들을 제공합니다. 여기에 문서의 예는 다음과 같습니다 아이가 직접 마스터의 서버에 수신 여기

master.js

var server = require('net').createServer(); 
var child = require('child_process').fork(__dirname + '/child.js'); 
// Open up the server object and send the handle. 
server.listen(1337, function() { 
    child.send({ server: true }, server._handle); 
}); 

child.js

process.on('message', function(m, serverHandle) { 
    if (serverHandle) { 
    var server = require('net').createServer(); 
    server.listen(serverHandle); 
    } 
}); 

. 따라서 도메인 체크가 없습니다. 여기에 막 다른 골목이 있습니다.

나는 또한 Cluster을 생각했지만 핸들과 동일한 기술을 사용하므로 동일한 제한 사항이 있습니다.

그래서 ... 좋은 아이디어가 있습니까?

현재 내가하는 일은 오히려 해킹입니다. distroy이라는 패키지를 만들었습니다. 그것은 포트 80에 바인딩하고 내부적으로는 별도의 앱이 청취하는 /tmp/distroy/http/www.example.com과 같은 Unix 도메인 소켓 경로에 대한 모든 요청을 프록시합니다. 이 또한 (일종의) HTTPS 작동합니다 (나의 질문에 SNI 참조). 남아있는 문제는 원래 IP 주소가 손실된다는 것입니다. 이제는 항상 127.0.0.1입니다. 나는이 연결을 열기 전에 IP 주소를 전송할 수 있도록 net.Server을 monkeypatching하여이 문제를 회피 할 수 있다고 생각합니다.

+1

누군가이 문제에 대한 "더 잘 맞는"해결책을 제시하면 올바른 답으로 표시 할 것입니다. – buschtoens

+0

현재이 문제를 해결해야하는 작업을하고 있습니다 ... – buschtoens

+0

IIS에서 노드를 실행하는 동안이 작업을 수행하는 방법을 아는 사람이 있습니까? –

답변

1

개인적으로, 나는 그들 모두에게 전용 포트 또는 선호 소켓을 듣고 전용 라우터 스크립트 나 nginx 뒤에 모든 것을 붙이도록했다. 그것은 가장 간단한 방법 인 IMO입니다.

+0

나는 내부적으로 요청을 다시 작성하는 경량의 node.js-script를 가지고 있다고 생각한다. 하지만 슬프게도이 순간에는 불가능하며 유닉스 소켓을 고수해야합니다. – buschtoens

+1

almypal의 권장 사항이 정확히 동일 할 때 (다른 포트에 모든 것을두고 별도의 라우터 사용) 0/02로가는 이유는 정말로 혼란 스럽습니다. 6/0갑니다. 나는 깊은 수준에 관심이 없지만 호기심이 많습니다. – Chuck

9

node.js 솔루션에 대한 정보가 필요하면 bouncy을 확인하십시오. node.js에 websocket 및 https 가능 http 라우터 프록시 /로드 밸런서가 있습니다.

{ 
     "beep.example.com" : 8000, 
     "boop.example.com" : 8001 
} 

처럼 routes.json을 정의하고 vhost 확장이 연결 미들웨어를 들어

bouncy routes.json 80 
+0

탄력은 [http-proxy] (https://github.com/nodejitsu/node-http-proxy)와 거의 같습니다. 이런 종류의 해결책에 대해 저를 괴롭게하는 것은 프로젝트 서버가 포트 80에 바인딩해야하기 때문에 실제로 사용하지 않는 다른 포트에 바인딩한다는 사실입니다. – buschtoens

+0

http 프록시에 +1 - 이것이 내가 사용하는 것입니다. – bryanmac

0

사용하여 탄력을 실행합니다. 어쩌면 당신은 그들의 개념 중 일부를 복사 할 수 있습니다.

+0

Connect 's 'vhost'는 기본적으로 이것을합니다 :'server.emit ('request', req, res);'. 나는 이미 그것을 시도했다. 자식 프로세스의 서버 인스턴스를 가져와 이벤트를 발생시킬 수 있어야합니다. node.js가이 인스턴스를 내부적으로 문자열 화하기 때문에 모든 참조가 손실되고 이벤트를 내보낼 수 없습니다. – buschtoens

관련 문제