Проблема конфигурации порта экспресс-сервера в режиме кластера pm2
Проблема: мы запускаем pm2 в режиме кластера, и pm2 запускает столько процессов, сколько имеется ядер процессора, pm2 также пытается запустить столько серверов узлов, сколько имеется ядер процессора, но проблема здесь в том, что он не запускает столько серверов, потому что они все пытаются запустить на том же порту, который 3000, который уже занят сервером первого узла
Мы использовали nginx и прокси его на 3000 порт.
мы используем pm2 в режиме кластера со следующей конфигурацией:
{
"apps" : [{
"script" : "npm",
"instances" : "max",
"cwd":"/home/nginx/my-pwa" ,
"args" : "run start:server:prod",
"exec_mode" : "cluster",
"wait_ready": true,
"kill_timeout" : 4000,
"watch" : true
}]
}
run start: server: prod это наш скрипт для запуска сервера
Наш экспресс сервер:
var app = require('../src/app');
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
const http = require('http');
server = http.createServer(app);
server.listen(port));
server.on('error', onError);
server.on('listening', onListening);
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;
}
}
process.on('message', function(msg) {
if (msg == 'shutdown') {
server.close();
process.exit(0);
}
});
// Listening logic
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
console.log("Server started on ", bind);
process.send('ready');
}
Пожалуйста, помогите, это важно для миссии!
4 ответа
Проблема в том, что pm2 плохо работает с npm. Он не может запустить два сервера узлов, используя скрипт npm. Правильный путь заключается в использовании узла
Мой предыдущий конфиг:
{
"apps" : [{
"script" : "npm",
"instances" : "max",
"cwd":"/home/nginx/my-pwa" ,
"args" : "run start:server:prod",
"exec_mode" : "cluster",
"wait_ready": true,
"kill_timeout" : 4000,
"watch" : true
}]
}
Мой новый конфиг:
{
"apps" : [{
"script" : "./server/bin/www",
"instances" : "max",
"exec_mode" : "cluster",
"cwd":"/home/nginx/my-pwa" ,
"env": {"NODE_ENV" : "production"},
"name" : "my-pwa"
}]
}
Как вы видите, я больше не использую "script": "npm". ./server/bin/www содержит мой экспресс-сервер, который pm2 будет выполнять с использованием узла. Теперь pm2 может автоматически обрабатывать кластеризацию. Так как же теперь должен выглядеть вывод? Это делает одного бога, который управляет экземплярами рабочего сервера, которые соответствуют количеству ядер вашего процессора. Вывод на наш сервер: (имеет 2 ядра)
nginx 1363 1 0 05:20 ? 00:00:03 PM2 v2.10.1: God Daemon (/home/nginx/.pm2)
nginx 1373 1363 0 05:20 ? 00:00:09 node /home/nginx/my-pwa/server/bin/www
nginx 1374 1363 0 05:20 ? 00:00:09 node /home/nginx/my-pwa/server/bin/www
Также теперь pm2 reload работает нормально. Когда я вижу журналы при перезагрузке, pm2 сначала запускает новых рабочих, а затем выключает старых.
Для меня меняется exec_mode
в cluster_mode
работал.
Мой ecosystem.config.js был изменен на что-то вроде этого
apps: [
{
script: 'server.js',
instances: 'max',
exec_mode: 'cluster_mode' // not 'fork' or 'cluster'
}
]
Моя проблема заключалась в том, что скрипт нужно было назвать
ecosystem.config.js
что-либо еще не запустится в кластерном режиме. он запустится в разветвленном режиме, но имя файла необходимо для любой другой конфигурации.
Я не думаю, что вы можете использовать кластерный режим pm2 со сценариями npm. Сначала проверьте, действительно ли процесс находится в режиме кластера, используя pm2 list
, Если это не так, попробуйте изменить свою конфигурацию, чтобы вызывать скрипт узла напрямую вместо вызова скрипта npm.