Nodejs 如何使用 pm2 部署 express 多进程

发布于 1周前 作者 phonegap100 来自 nodejs/Nestjs

Nodejs 如何使用 pm2 部署 express 多进程

pm2 start app.js 可以成功。但如果开启多个 cluster , pm2 start app.js -i 4 就会失败。请问如何解决

21 回复

作为写代码的,失败不给出错信息别人咋解决?


猜测是开了四个实例,监听端口却是相同的,然后互相冲突。

PM2: 2016-07-03 13:46:11: App name:index id:0 online

index-0 (err): at handleMessage (child_process.js:327:10)
index-0 (err): at Pipe.channel.onread (child_process.js:355:11)
index-0 (err): Error: bind EADDRINUSE
index-0 (err): at exports._errnoException (util.js:746:11)
index-0 (err): at cb (net.js:1207:33)
index-0 (err): at rr (cluster.js:595:14)
index-0 (err): at Worker.<anonymous> (cluster.js:566:9)
index-0 (err): at process.<anonymous> (cluster.js:695:8)
index-0 (err): at process.emit (events.js:129:20)
index-0 (err): at handleMessage (child_process.js:327:10)
index-0 (err): at Pipe.channel.onread (child_process.js:355:11)
index-0 (err): Error: bind EADDRINUSE
index-0 (err): at exports._errnoException (util.js:746:11)
index-0 (err): at cb (net.js:1207:33)
index-0 (err): at rr (cluster.js:595:14)
index-0 (err): at Worker.<anonymous> (cluster.js:566:9)
index-0 (err): at process.<anonymous> (cluster.js:695:8)
index-0 (err): at process.emit (events.js:129:20)
index-0 (err): at handleMessage (child_process.js:327:10)
index-0 (err): at Pipe.channel.onread (child_process.js:355:11)

cluster 模式不是只需要一个端口吗。还是因为我的 CPU 只有一个?

这个我试了。不是这个原因。

你的端口已经被占用了,换个新的试试

netstat -nltp | grep 8100 返回是 0 然后我用 pm2 start app.js -i 4 就出现错误。但是如果只是 pm2 start app.js 就正常的。

子进程的端口被占用了

pm2 以 cluster 的模式如何多进程呀。子进程还要增加端口吗。不是像 supervisor 一样增加 worker 吗

我刚才测试了一下, cluster 是用同一个端口的,而且以前我写的一个程序也用是这样运行不会出现端口冲突的。
所以应该不是因为进程端口的问题,我的几个建议
1 、你检查一下会不会是硬盘空间满了导致的,刚才搜了一下,有个人因为 pm2.log 太大( 30G ),塞满了硬盘空间导致出现跟你一样的问题。
2 、在其他环境运行一下看看有没有问题。
3 、备份并清空~/.pm2/pm2.log 文件,然后再运行,看看有没有更完整的信息

刚才我又测试了一下,确实如果端口被占用了是会有这个错误的
而且错误会一直刷日志
如果修正错误后,用 pm2 logs 会显示上一次的错误日志
你看看你是不是真的没启动到

或者用 pm2 flush 清理一下日志再试试吧
还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的?

突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看

貌似是需要多 CPU,你有几个 CPU, cluster mode 开启之后就会给你加几个负载进程

另外你仔细看官方文档介绍 cluster mode 的地方,第一段就说了和 CPU 数量有关.

代码很简单
var stream = require(“stream”),
request = require(“request”),
express = require(“express”);
var utils = require(‘utility’);
var app = express();

app.get(’/watch’, function (req, res) {
var url = req.query.v;
console.log(url);
var dd = utils.base64decode(url);
request(dd).pipe(res);
});

var server = app.listen(8100, function () {
var host = server.address().address;
var port = server.address().port;
console.log(“Running on %s:%s”, host, port);
});

server.listen(8100);
我用 pm2 flush 了也不行。如果已经有以 fork 形式启动后再以 cluster 启动,结果就是之前启动的也会挂掉。我升级到 2 个 CPU 了,也不行。看来跟 CPU 没关系。

先把所有 node 进程都结束了再启动吧

暂时以 fork 模式多进程吧。 cluster 暂时搞不定

你为何要 listen 两次……

原来是这个原因。删掉一个就好了。多谢

在 Node.js 中使用 PM2 部署 Express 应用并实现多进程,可以有效提高应用的性能和稳定性。以下是具体步骤和示例代码:

  1. 安装 PM2: 首先,确保你已经全局安装了 PM2。你可以通过 npm 或 yarn 安装:

    npm install -g pm2
    
  2. 创建 Express 应用: 创建一个简单的 Express 应用,例如 app.js

    const express = require('express');
    const app = express();
    const port = 3000;
    
    app.get('/', (req, res) => {
        res.send('Hello, PM2 with Express!');
    });
    
    app.listen(port, () => {
        console.log(`App running at http://localhost:${port}/`);
    });
    
  3. 使用 PM2 启动多进程: 在命令行中,使用 PM2 启动应用并设置实例数(多进程):

    pm2 start app.js -i 4 --name my-express-app
    

    这里 -i 4 表示启动 4 个实例,--name my-express-app 为应用指定一个名称。

  4. 查看和管理应用: 你可以使用以下命令查看应用状态、停止或重启应用:

    pm2 list       # 查看所有应用
    pm2 stop my-express-app  # 停止应用
    pm2 restart my-express-app  # 重启应用
    

通过上述步骤,你就可以使用 PM2 在 Node.js 中部署一个支持多进程的 Express 应用了。PM2 还提供了更多功能,如负载均衡、日志管理等,可以进一步提升应用的性能和可维护性。

回到顶部