当我意识到 PM2 无法在 Windows 上运行时,我正在使用 PM2 以集群模式启动我的 Web 应用程序,我试图跟踪问题并意识到我的系统上的各种集群都失败了。
当我尝试启动任何集群节点应用程序时,它启动正常,直到发出第一个请求,然后其中一个子进程(分叉)死亡,应用程序停止响应 http 请求。
我编了一个最简单的例子来展示这个问题:
const cluster = require('cluster');
const http = require('http');
const numCPUs = 4;
if (cluster.isMaster) {
for (let i = 0; i < numCPUs; i++) {
cluster.fork().on('exit', (code, signal) => {
if (signal) {
console.log(`worker was killed by signal: ${signal}`);
} else if (code !== 0) {
console.log(`worker exited with error code: ${code} = 0x${code.toString(16)}`);
} else {
console.log('worker success!');
}
});
}
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end(`process ${process.pid} says hello!`);
}).listen(8000);
process.on('uncaughtException', () => console.log('uncaughtException'));
process.on('unhandledRejection', () => console.log('unhandledRejection'));
process.on('error', () => console.log('error'));
process.on('exit', () => console.log('exit'));
}
我运行这个例子
node app.js
在发出第一个请求之前,输出为空,然后输出:
worker exited with error code: 3221225477 = 0xc0000005
并且没有任何 fork 错误处理程序打印任何内容。
当我使用 pm2 (without if (cluster.isMaster)
part)运行类似的示例时,基本上会发生同样的事情,在这种情况下,在一个进程死亡后 pm2 会恢复它,但应用程序仍然不会响应 http 请求。
我使用的是8.1.2
64 位节点版本,该示例在 Ubuntu 上完美运行,我没有机会在不同的 Windows 机器上对其进行测试。
更新:我尝试使用 32 位版本的节点并且它有效,但仍然有兴趣解决它。