Node.JS 응용 프로그램의 코드를 다시 시작하지 않고 변경하는 방법이 있습니까?Node.JS 웹 응용 프로그램을 다시 시작하지 않고 업그레이드하십시오.
예를 들어 파일을 서버에서 다운로드 할 때 파일 전송을 중단하지 않고 서버를 업그레이드 할 수 있습니까?
Node.JS 응용 프로그램의 코드를 다시 시작하지 않고 변경하는 방법이 있습니까?Node.JS 웹 응용 프로그램을 다시 시작하지 않고 업그레이드하십시오.
예를 들어 파일을 서버에서 다운로드 할 때 파일 전송을 중단하지 않고 서버를 업그레이드 할 수 있습니까?
예, cluster 모듈을 사용하는 것이 가능합니다.
기본적으로 마스터 프로세스를 통해 동일한 포트를 공유하는 앱의 여러 슬레이브 인스턴스를 시작합니다. 마스터는 들어오는 연결을 슬레이브에 배포합니다. 다시 시작하려는 경우
는, 마스터는 순서대로합니다 : 그것은 을 리스폰하는 노예로
시작하려면 몇 가지 코드가 필요합니다 (npm install async underscore
필요).
참고 : 이것은 시작에 불과합니다. 실제 설정에서 예상치 못한 슬레이브 오류 및 시간 초과를 처리 할 준비가되어 있어야합니다.
var cluster = require('cluster');
var http = require('http');
var _ = require('underscore');
var async = require('async');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log('starting master with PID', process.pid);
// Fork workers.
var slaves = {};
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('fork', function (worker) {
slaves[worker.id] = worker;
});
cluster.on('exit', function (worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
delete slaves[worker.id];
// restart the worker
cluster.fork();
});
process.on('SIGHUP', function restartApp() {
console.log('restarting all slaves');
// important: force node.js to reload all js sources
delete require.cache;
var toRestart = _(slaves).values();
async.eachSeries(toRestart, function (slave, done) {
slave.kill('SIGTERM');
// when the new worker starts, proceed to the next instance
cluster.once('listening', function() {
done();
});
});
});
} else {
console.log('- starting slave with PID', process.pid);
// Workers can share any TCP connection
// In this case its a HTTP server
var server = http.createServer(function(req, res) {
res.writeHead(200);
res.end("hello world\n");
});
process.on('SIGTERM', function() {
// finish all current connections, then stop
server.close(function() {
process.exit(0);
});
});
server.listen(8000);
}
당신이 kill -HUP를`전화
, 당신은 순서에있는 모든 노예를 다시 시작 것을 볼 수 있습니다 :worker 5156 died
- starting slave with PID 5164
worker 5157 died
- starting slave with PID 5165
worker 5158 died
- starting slave with PID 5166
worker 5159 died
- starting slave with PID 5167
다시 시작하는 동안, 들어오는 연결을 처리하기 위해 3 실행 노예는 항상있다.
마지막으로 한 가지 : 시도 할 경우 console.log
은 슬레이브 SIGTERM 처리기에서 이미 마스터와의 연결이 끊어져 있기 때문에 아무 것도 수행하지 않습니다.