adrianvlupu
5/20/2015 - 4:36 PM

Clustered Express4 App

Clustered Express4 App

var cluster = require('cluster');

if (cluster.isMaster) {
    var cpuCount = 4; //require('os').cpus().length;
    for (var i = 0; i < cpuCount; i += 1) {
        cluster.fork();
    }
    
    cluster.on('online', function (worker) {
        console.log('Worker ' + worker.process.pid + ' is online.');
    });
    cluster.on('exit', function (worker) {
        console.error('Worker ' + worker.id + ' died');
        cluster.fork();
    });
}
else {
    initApp();
}

function initApp() {
    /**
     * Module dependencies.
     */

    var app = require('../app');
    var debug = require('debug')('stack-exchange:server');
    var http = require('http');
    
    /**
     * Get port from environment and store in Express.
     */

    var port = normalizePort(process.env.PORT || '3000');
    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.
     */

    function normalizePort(val) {
        var port = parseInt(val, 10);
        
        if (isNaN(port)) {
            // named pipe
            return val;
        }
        
        if (port >= 0) {
            // port number
            return port;
        }
        
        return false;
    }
    
    /**
     * Event listener for HTTP server "error" event.
     */

    function onError(error) {
        if (error.syscall !== 'listen') {
            throw error;
        }
        
        var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port
        
        // handle specific listen errors with friendly messages
        switch (error.code) {
            case 'EACCES':
                console.error(bind + ' requires elevated privileges');
                process.exit(1);
                break;
            case 'EADDRINUSE':
                console.error(bind + ' is already in use');
                process.exit(1);
                break;
            default:
                throw error;
        }
    }
    
    /**
     * Event listener for HTTP server "listening" event.
     */

    function onListening() {
        var addr = server.address();
        var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
        debug('Listening on ' + bind);
    }
    
};