From 7a0c33ccb192f971f57c0e8773111102f94847d2 Mon Sep 17 00:00:00 2001 From: donnaknew Date: Sat, 12 Aug 2017 16:58:36 +0900 Subject: [PATCH 1/3] run with master cluster & worker --- app.js | 1 + bin/www | 83 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/app.js b/app.js index 4c9a713..5c9cfab 100644 --- a/app.js +++ b/app.js @@ -51,6 +51,7 @@ app.use('/error/test', errorTest); app.use('/view/test', viewTest); app.use('/app-location', appLocation); app.use('/campaign', campView); +// app.use(express.static('routes')); // error -this must be the last position in file // catch 404 and forward to error handler diff --git a/bin/www b/bin/www index 8b2a973..7ccb938 100755 --- a/bin/www +++ b/bin/www @@ -4,30 +4,87 @@ * Module dependencies. */ -var app = require('../app'); +// var app = require('../app'); var debug = require('debug')('campaign-server:server'); var http = require('http'); +var cluster = require('cluster'); +var os = require('os'); /** * Get port from environment and store in Express. */ - var port = normalizePort(process.env.PORT || '30022'); -app.set('port', port); +var server; +cluster.schedulingPolicy = cluster.SCHED_RR; -/** - * Create HTTP server. - */ +function startClusterMaster(){ + console.log('Now master cluster.'); + var cpuNumber = os.cpus().length; -var server = http.createServer(app); + for(var i = 0; i < cpuNumber; i++){ + cluster.fork(); + } -/** - * Listen on provided port, on all network interfaces. - */ + cluster.on('fork', function(worker){ + console.log('Worker ' + worker.process.pid + ' is forked.'); + }) + + cluster.on('online', function(worker){ + console.log('Worker ' + worker.process.pid + ' is online.'); + }); + + cluster.on('exit', function(worker, code, signal){ + console.log('Worker ' + worker.process.pid + ' is exit.'); + console.log('Code: ' + code); + + if(code === 200){ + setTimeout(function(){ + cluster.fork(); + }, 1000); + } + }); +} + +function startClusterWorker(){ + console.log('Now worker cluster.'); + + var app = require('../app'); + + app.set('port', port); + + /** + * Create HTTP server. + */ + server = http.createServer(app); + /** + * Listen on provided port, on all network interfaces. + */ + server.listen(port); + server.on('error', onError); + server.on('listening', onListening); +} + +function startCluster(){ + return (cluster.isMaster) ? startClusterMaster() : startClusterWorker(); +} -server.listen(port); -server.on('error', onError); -server.on('listening', onListening); +startCluster(); + +// app.set('port', port); +// +// /** +// * Create HTTP server. +// */ +// +// var server = http.createServer(app); +// +// /** +// * Listen on provided port, on all network interfaces. +// */ +// +// server.listen(port); +// server.on('error', onError); +// server.on('listening', onListening); /** * Normalize a port into a number, string, or false. From dd2f4827e74103247aafd16bee431b5fca999af5 Mon Sep 17 00:00:00 2001 From: donnaknew Date: Tue, 15 Aug 2017 14:25:15 +0900 Subject: [PATCH 2/3] add command 'quit' -> shutdown server, 'kill' -> for test now, 'list' -> cluster worker pid list, 'detail' -> cluster worker detail list --- bin/www | 77 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 14 deletions(-) diff --git a/bin/www b/bin/www index 7ccb938..70bf32e 100755 --- a/bin/www +++ b/bin/www @@ -18,50 +18,99 @@ var server; cluster.schedulingPolicy = cluster.SCHED_RR; function startClusterMaster(){ - console.log('Now master cluster.'); + console.log('[Enter Master Cluster]'); + var cpuNumber = os.cpus().length; + var worker; for(var i = 0; i < cpuNumber; i++){ - cluster.fork(); + worker = cluster.fork(); } cluster.on('fork', function(worker){ - console.log('Worker ' + worker.process.pid + ' is forked.'); + console.log('[Worker Forked]: ' + worker.process.pid); }) cluster.on('online', function(worker){ - console.log('Worker ' + worker.process.pid + ' is online.'); + console.log('[Worker Online]: ' + worker.process.pid); + }); + + cluster.on('message', function(worker, message, handle){ + console.log('[Worker Send Message]: '+ worker.process.pid +' \'' + message + '\''); + + switch (message) { + case 'quit': + process.exit(0); + break; + case 'kill': + worker.kill(); + break; + case 'list': + for(const id in cluster.workers){ + console.log(cluster.workers[id].process.pid); + } + break; + case 'detail': + for(const id in cluster.workers){ + console.log(cluster.workers[id]); + } + break; + default: + break; + } }); cluster.on('exit', function(worker, code, signal){ - console.log('Worker ' + worker.process.pid + ' is exit.'); - console.log('Code: ' + code); + console.log('[Worker Exit]: ' + worker.process.pid); + console.log('[Kill Status Code]: ' + code); if(code === 200){ setTimeout(function(){ cluster.fork(); }, 1000); + }else if(code === null){ + console.log('test kill'); + setTimeout(function(){ + cluster.fork(); + console.log('[Number of Workers]:' + Object.keys(cluster.workers).length); + }, 1000); } }); } function startClusterWorker(){ - console.log('Now worker cluster.'); + console.log('[Enter Worker Cluster]'); var app = require('../app'); app.set('port', port); - - /** - * Create HTTP server. - */ server = http.createServer(app); - /** - * Listen on provided port, on all network interfaces. - */ server.listen(port); server.on('error', onError); server.on('listening', onListening); + + process.stdin.resume(); + process.stdin.setEncoding('utf8'); + process.stdin.on('data', function (command) + { + var i; + // 끝부분의 newline character들을 없앤다. + for (i = command.length - 1; + (i >= 0) && ((command.charAt(i) === '\r') || (command.charAt(i) === '\n')); + i--); + if (i >= 0) + command = command.substring(0, i + 1); + getCommand(command); + }); + + process.on('message', function(message){ + console.log('[Master Send Message]: \'' + message + '\''); + }); +} + +function getCommand(command){ + console.log('[Command Input]: \'' + command + '\''); + process.send(command); } function startCluster(){ From 8e8988a20f1b30e5df6b9665868a40650f135aee Mon Sep 17 00:00:00 2001 From: donnaknew Date: Tue, 15 Aug 2017 15:46:01 +0900 Subject: [PATCH 3/3] add force quit, quit! & quit, quit command --- bin/www | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/bin/www b/bin/www index 70bf32e..7c456ce 100755 --- a/bin/www +++ b/bin/www @@ -18,7 +18,7 @@ var server; cluster.schedulingPolicy = cluster.SCHED_RR; function startClusterMaster(){ - console.log('[Enter Master Cluster]'); + console.log('[Start Master Cluster]'); var cpuNumber = os.cpus().length; var worker; @@ -40,6 +40,9 @@ function startClusterMaster(){ switch (message) { case 'quit': + shutdownServer('SIGKILL'); + break; + case 'quit!': process.exit(0); break; case 'kill': @@ -68,7 +71,11 @@ function startClusterMaster(){ setTimeout(function(){ cluster.fork(); }, 1000); - }else if(code === null){ + } + // else if(signal === 'SIGKILL'){ + // + // } + else if(code === null && signal !== 'SIGKILL'){ console.log('test kill'); setTimeout(function(){ cluster.fork(); @@ -79,7 +86,7 @@ function startClusterMaster(){ } function startClusterWorker(){ - console.log('[Enter Worker Cluster]'); + console.log('[Start Worker Cluster]: ' + cluster.worker.process.pid); var app = require('../app'); @@ -113,6 +120,17 @@ function getCommand(command){ process.send(command); } +function shutdownServer(msg){ + console.log('[Shutdown Server]'); + for (const id in cluster.workers){ + if (cluster.workers.hasOwnProperty(id)){ + worker = cluster.workers[id]; + console.log('[Killing Worker]: ' + worker.process.pid); + worker.process.kill(msg); + } + } +} + function startCluster(){ return (cluster.isMaster) ? startClusterMaster() : startClusterWorker(); }