0

当我意识到 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.264 位节点版本,该示例在 Ubuntu 上完美运行,我没有机会在不同的 Windows 机器上对其进行测试。

更新:我尝试使用 32 位版本的节点并且它有效,但仍然有兴趣解决它。

4

0 回答 0