Я немного урезал плиту Express, но это общая идея:
var app = require('../app');
var http = require('http');
var cluster = require('cluster');
var port = process.env.PORT || '3000';
app.set('port', port);
// Code to run if we're in the master process
if (cluster.isMaster) {
var cpuCount = require('os').cpus().length;
// Create a worker for each CPU
for (var i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
} else {
var server = http.createServer(app);
server.listen(port);
server.on('listening', onListening);
}
cluster.on('exit', function(worker) {
console.log('Worker ' + worker.id + ' died :(');
cluster.fork();
});
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
console.log('Listening on ' + bind);
}
Ключевое отличие здесь - var app = require('../app');
вверху.
app
экспортирует экспресс-экземпляр. Вы создаете по одному на каждого работника.
Попробуйте перестроить код на:
var cluster = require('cluster');
var https = require('http');
var express = require('express');
var app = express();
if (cluster.isMaster) {
// Count the machine's CPUs
var cpuCount = require('os').cpus().length;
// Create a worker for each CPU
for (var i = 0; i < cpuCount; i += 1) {
cluster.fork();
}
} else {
var serv = https.createServer(app);
serv.listen(80);
console.log("Server started.");
}
Важная часть это
var serv = https.createServer(app);
serv.listen(80);
Заставить каждую форму сервера прослушивать порт 80 - вместо создания отдельных экземпляров app
, которые все пытаются связывать и прослушивать этот порт, что приводит к ошибке EADDRINUSE.