如何使用 pm2 部署 express 多进程

2016-07-04 01:41:07 +08:00
 wico77

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

11460 次点击
所在节点    Node.js
20 条回复
airyland
2016-07-04 01:54:53 +08:00
作为写代码的,失败不给出错信息别人咋解决?
DoraJDJ
2016-07-04 01:59:38 +08:00
猜测是开了四个实例,监听端口却是相同的,然后互相冲突。
wico77
2016-07-04 02:08:57 +08:00
@airyland 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)
wico77
2016-07-04 02:10:09 +08:00
@DoraJDJ cluster 模式不是只需要一个端口吗。还是因为我的 CPU 只有一个?
DoraJDJ
2016-07-04 02:20:47 +08:00
wico77
2016-07-04 02:35:07 +08:00
@DoraJDJ 这个我试了。不是这个原因。
Mirana
2016-07-04 03:01:49 +08:00
你的端口已经被占用了,换个新的试试
wico77
2016-07-04 03:09:38 +08:00
@Mirana netstat -nltp | grep 8100 返回是 0 然后我用 pm2 start app.js -i 4 就出现错误。但是如果只是 pm2 start app.js 就正常的。
Mirana
2016-07-04 03:59:34 +08:00
子进程的端口被占用了
wico77
2016-07-04 05:35:53 +08:00
@Mirana pm2 以 cluster 的模式如何多进程呀。子进程还要增加端口吗。不是像 supervisor 一样增加 worker 吗
ThreeBody
2016-07-04 08:31:05 +08:00
我刚才测试了一下, cluster 是用同一个端口的,而且以前我写的一个程序也用是这样运行不会出现端口冲突的。
所以应该不是因为进程端口的问题,我的几个建议
1 、你检查一下会不会是硬盘空间满了导致的,刚才搜了一下,有个人因为 pm2.log 太大( 30G ),塞满了硬盘空间导致出现跟你一样的问题。
2 、在其他环境运行一下看看有没有问题。
3 、备份并清空~/.pm2/pm2.log 文件,然后再运行,看看有没有更完整的信息
ThreeBody
2016-07-04 08:56:52 +08:00
刚才我又测试了一下,确实如果端口被占用了是会有这个错误的
而且错误会一直刷日志
如果修正错误后,用 pm2 logs 会显示上一次的错误日志
你看看你是不是真的没启动到

或者用 pm2 flush 清理一下日志再试试吧
还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的?
ThreeBody
2016-07-04 11:43:17 +08:00
突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看
marvinwilliam
2016-07-04 13:28:17 +08:00
貌似是需要多 CPU,你有几个 CPU, cluster mode 开启之后就会给你加几个负载进程
marvinwilliam
2016-07-04 13:29:46 +08:00
另外你仔细看官方文档介绍 cluster mode 的地方,第一段就说了和 CPU 数量有关.
wico77
2016-07-04 14:57:16 +08:00
@ThreeBody 代码很简单
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 没关系。
shyling
2016-07-04 15:05:24 +08:00
先把所有 node 进程都结束了再启动吧
wico77
2016-07-04 15:16:28 +08:00
暂时以 fork 模式多进程吧。 cluster 暂时搞不定
ThreeBody
2016-07-04 15:50:56 +08:00
你为何要 listen 两次……
wico77
2016-07-04 17:14:29 +08:00
@ThreeBody 原来是这个原因。删掉一个就好了。多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/290052

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX