diff --git a/bws.js b/bws.js index 51471e5..8102e3b 100755 --- a/bws.js +++ b/bws.js @@ -1,18 +1,50 @@ #!/usr/bin/env node +var fs = require('fs'); + var ExpressApp = require('./lib/expressapp'); var WsApp = require('./lib/wsapp'); var config = require('./config'); var port = process.env.BWS_PORT || config.port || 3232; -var app = ExpressApp.start(config); -//app.listen(port); +var cluster = require('cluster'); +var http = require('http'); +var numCPUs = require('os').cpus().length; + +var serverModule = config.https ? require('https') : require('http'); +var serverOpts = {}; + +if (config.https) { + serverOpts.key = fs.readFileSync(config.privateKeyFile || './ssl/privatekey.pem'); + serverOpts.cert = fs.readFileSync(config.certificateFile || './ssl/certificate.pem'); +} -var server = require('http').Server(app); +var startOne = function() { + var app = ExpressApp.start(config); + var server = config.https ? serverModule.createServer(serverOpts, app) : + serverModule.Server(app); + var ws = WsApp.start(server, config); + server.listen(port); + console.log('Bitcore Wallet Service running on port ' + port); +}; -var ws = WsApp.start(server, config); +if (!config.cluster) { + startOne(); +} else { + if (!config.storageOpts.multiLevel || !config.lockOpts.lockerServer) + throw 'When running in cluster mode, multilevel and locker server need to be configured'; -server.listen(port); + var clusterInstances = config.clusterInstances || numCpus; -console.log('Bitcore Wallet Service running on port ' + port); + if (cluster.isMaster) { + for (var i = 0; i < clusterInstances; i++) { + cluster.fork(); + } + cluster.on('exit', function(worker, code, signal) { + console.log('worker ' + worker.process.pid + ' died'); + }); + } else { + startOne(); + } +} diff --git a/config.js b/config.js index f58e934..6c0ba86 100644 --- a/config.js +++ b/config.js @@ -2,19 +2,28 @@ var config = { basePath: '/bws/api', disableLogs: false, port: 3232, + // Uncomment to make BWS a forking server + cluster: true, + // Uncomment to use the nr of availalbe CPUs + clusterInstances: 4, + + // https: true, + // privateKeyFile: 'private.pem', + // certificateFile: 'cert.pem', + storageOpts: { - dbPath: './db', - // multiLevel: { - // host: 'localhost', - // port: 3230, - // }, + // dbPath: './db', + multiLevel: { + host: 'localhost', + port: 3230, + }, }, lockOpts: { // To use locker-server, uncomment this: - // lockerServer: { - // host: 'localhost', - // port: 3231, - // }, + lockerServer: { + host: 'localhost', + port: 3231, + }, }, blockchainExplorerOpts: { livenet: {