V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wico77
V2EX  ›  Node.js

如何使用 pm2 部署 express 多进程

  •  
  •   wico77 · 2016-07-04 01:41:07 +08:00 · 11453 次点击
    这是一个创建于 3083 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    或者用 pm2 flush 清理一下日志再试试吧
    还有就是,会不会是你的代码写得比较特殊会自己创建端口什么的?
    ThreeBody
        13
    ThreeBody  
       2016-07-04 11:43:17 +08:00 via Android
    突然又想到一个问题,会不会是进程以 fork 模式启动了,启动后 pm2 list 看看
    marvinwilliam
        14
    marvinwilliam  
       2016-07-04 13:28:17 +08:00
    貌似是需要多 CPU,你有几个 CPU, cluster mode 开启之后就会给你加几个负载进程
    marvinwilliam
        15
    marvinwilliam  
       2016-07-04 13:29:46 +08:00
    另外你仔细看官方文档介绍 cluster mode 的地方,第一段就说了和 CPU 数量有关.
    wico77
        16
    wico77  
    OP
       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
        17
    shyling  
       2016-07-04 15:05:24 +08:00
    先把所有 node 进程都结束了再启动吧
    wico77
        18
    wico77  
    OP
       2016-07-04 15:16:28 +08:00
    暂时以 fork 模式多进程吧。 cluster 暂时搞不定
    ThreeBody
        19
    ThreeBody  
       2016-07-04 15:50:56 +08:00 via Android
    你为何要 listen 两次……
    wico77
        20
    wico77  
    OP
       2016-07-04 17:14:29 +08:00
    @ThreeBody 原来是这个原因。删掉一个就好了。多谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   897 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:51 · PVG 03:51 · LAX 11:51 · JFK 14:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.