如何使用 pm2 部署 express 多进程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wico77

如何使用 pm2 部署 express 多进程

  •  
  •   wico77 2016 年 7 月 4 日 11924 次点击
    这是一个创建于 3582 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    或者用 pm2 flush 清理一下日志再试试吧
    还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的?
    ThreeBody
        13
    ThreeBody  
       2016 年 7 月 4 日 via Android
    突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看
    marvinwilliam
        14
    marvinwilliam  
       2016 年 7 月 4 日
    貌似是需要多 CPU,你有几个 CPU, cluster mode 开启之后就会给你加几个负载进程
    marvinwilliam
        15
    marvinwilliam  
       2016 年 7 月 4 日
    另外你仔细看官方文档介绍 cluster mode 的地方,第一段就说了和 CPU 数量有关.
    wico77
        16
    wico77  
    OP
       2016 年 7 月 4 日
    @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
        17
    shyling  
       2016 年 7 月 4 日
    先把所有 node 进程都结束了再启动吧
    wico77
        18
    wico77  
    OP
       2016 年 7 月 4 日
    暂时以 fork 模式多进程吧。 cluster 暂时搞不定
    ThreeBody
        19
    ThreeBody  
       2016 年 7 月 4 日 via Android
    你为何要 listen 两次……
    wico77
        20
    wico77  
    OP
       2016 年 7 月 4 日
    @ThreeBody 原来是这个原因。删掉一个就好了。多谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     933 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 22:37 PVG 06:37 LAX 15:37 JFK 18:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86