pm2集群模式的快速服务器端口配置问题
express server port configuration issue with pm2 cluster mode
问题:我们以集群模式启动pm2,pm2启动了与cpu个内核一样多的进程,pm2也尝试启动与cpu个内核一样多的节点服务器,但是这里的问题是它无法启动尽可能多的服务器,因为它们都尝试在同一个端口 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
}]
}
运行 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');
}
请帮忙,这是关键任务!
我认为您不能将 pm2 集群模式与 npm 脚本一起使用。首先使用 pm2 list
检查进程是否实际上处于集群模式。如果不是,请尝试修改您的配置以直接调用节点脚本而不是调用 npm 脚本。
问题是 pm2 不能很好地与 npm 配合使用。它无法使用 npm 脚本启动两个节点服务器。正确的方法是使用 node
我之前的配置:
{
"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 包含我的 express 服务器,pm2 将使用节点执行该服务器。现在 pm2 能够自动处理集群。
那么现在的输出应该是什么样子的呢?
它使一个神守护者根据您的 cpu 核心数量管理工作服务器实例。
我们服务器上的输出:(它有 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,pm2启动了与cpu个内核一样多的进程,pm2也尝试启动与cpu个内核一样多的节点服务器,但是这里的问题是它无法启动尽可能多的服务器,因为它们都尝试在同一个端口 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
}]
}
运行 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');
}
请帮忙,这是关键任务!
我认为您不能将 pm2 集群模式与 npm 脚本一起使用。首先使用 pm2 list
检查进程是否实际上处于集群模式。如果不是,请尝试修改您的配置以直接调用节点脚本而不是调用 npm 脚本。
问题是 pm2 不能很好地与 npm 配合使用。它无法使用 npm 脚本启动两个节点服务器。正确的方法是使用 node
我之前的配置:
{
"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 包含我的 express 服务器,pm2 将使用节点执行该服务器。现在 pm2 能够自动处理集群。 那么现在的输出应该是什么样子的呢? 它使一个神守护者根据您的 cpu 核心数量管理工作服务器实例。 我们服务器上的输出:(它有 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
其他任何东西都不会在集群模式下启动。它将以分叉模式启动,但任何其他配置都需要文件名。