루트 페이지가 여러 개의 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()
.
슬프게도 이것은 잘 작동하지 않습니다. 서버 인스턴스를 마스터 프로세스 (나중에 요청을 내 보냅니다) 또는 request
및 response
의 객체를 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하여이 문제를 회피 할 수 있다고 생각합니다.
누군가이 문제에 대한 "더 잘 맞는"해결책을 제시하면 올바른 답으로 표시 할 것입니다. – buschtoens
현재이 문제를 해결해야하는 작업을하고 있습니다 ... – buschtoens
IIS에서 노드를 실행하는 동안이 작업을 수행하는 방법을 아는 사람이 있습니까? –