Nodejs 如何使用 pm2 部署 express 多进程
Nodejs 如何使用 pm2 部署 express 多进程
pm2 start app.js 可以成功。但如果开启多个 cluster , pm2 start app.js -i 4 就会失败。请问如何解决
作为写代码的,失败不给出错信息别人咋解决?
猜测是开了四个实例,监听端口却是相同的,然后互相冲突。
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 吗
刚才我又测试了一下,确实如果端口被占用了是会有这个错误的
而且错误会一直刷日志
如果修正错误后,用 pm2 logs 会显示上一次的错误日志
你看看你是不是真的没启动到
或者用 pm2 flush 清理一下日志再试试吧
还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的?
突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看
另外你仔细看官方文档介绍 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 应用并实现多进程,可以有效提高应用的性能和稳定性。以下是具体步骤和示例代码:
-
安装 PM2: 首先,确保你已经全局安装了 PM2。你可以通过 npm 或 yarn 安装:
npm install -g pm2
-
创建 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}/`); });
-
使用 PM2 启动多进程: 在命令行中,使用 PM2 启动应用并设置实例数(多进程):
pm2 start app.js -i 4 --name my-express-app
这里
-i 4
表示启动 4 个实例,--name my-express-app
为应用指定一个名称。 -
查看和管理应用: 你可以使用以下命令查看应用状态、停止或重启应用:
pm2 list # 查看所有应用 pm2 stop my-express-app # 停止应用 pm2 restart my-express-app # 重启应用
通过上述步骤,你就可以使用 PM2 在 Node.js 中部署一个支持多进程的 Express 应用了。PM2 还提供了更多功能,如负载均衡、日志管理等,可以进一步提升应用的性能和可维护性。