关于 node 项目部署问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zqguo
V2EX    Node.js

关于 node 项目部署问题。

  •  
  •   zqguo 2023-05-22 14:30:25 +08:00 4350 次点击
    这是一个创建于 942 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教下大家,node 项目部署,使用 pm2 管理还是 docker 管理好?

    29 条回复    2023-05-26 09:03:18 +08:00
    smallWang
        1
    smallWang  
       2023-05-22 14:51:54 +08:00   1
    都行 反正守护进程是为了保活 ,docker 要保活的话不得搭配 k8 的探针吗? 或者自己写脚本
    zqguo
        2
    zqguo  
    OP
       2023-05-22 14:59:05 +08:00
    @smallWang 保活是指开机自启吗?
    dream4ever
        3
    dream4ever  
       2023-05-22 15:02:10 +08:00
    @zqguo 保活是指挂掉之后自动启动,和开机启动是两回事,Google 一下就能知道区别了。
    jabinsun
        4
    jabinsun  
       2023-05-22 15:05:42 +08:00
    @smallWang
    @zqguo
    docker 可以搭配 HEALTHCHECK
    smallWang
        5
    smallWang  
       2023-05-22 15:05:47 +08:00
    @zqguo ?你都不知道吗,不知道那就不建议用它
    pm2 是一个带有负载均衡功能的 Node 应用的多进程管理器,虽然是为 node 开发的,但也能管理其他程序进程
    当你要把你的独立代码利用全部的服务器上的所有 CPU ,并保证进程永远都活着,0 秒的重载,PM2 是完美的。

    主要特性:
    1 、多进程启动项目,内建负载均衡(使用 Node cluster 集群模块)
    2 、可启动静态文件服务(类似 nginx 静态服务)
    3 、可使用插件分割日志
    4 、可通过重启策略配置条件重载(可以运行一些脚本,定时任务等)
    5 、可以配置部署命令,轻量化一键部署项目(小项目可用,跟 devops 差得远)
    6 、有 pm2 服务接口,可远程获取 pm2 集群数据
    7 、具有 Ubuntu 和 CentOS 的启动脚本

    保活是为了让你 node 因为各种意外死掉之后可以自动重启
    pm2 很,我没用= =
    你的目的是啥?单纯的想把 node 部署到服务器上吗?那直接 node xxx.js 不就行了
    zubincheung
        6
    zubincheung  
       2023-05-22 15:06:05 +08:00
    就是保持容器的活动状态,出现故障时自动重启,也可以用 docker compose, 设置 restart 为 always
    smallWang
        7
    smallWang  
       2023-05-22 15:08:08 +08:00
    @jabinsun 我喜欢写 while 1==1 然后 里面不停的起来 并且 sleep(20)
    Usaki
        8
    Usaki  
       2023-05-22 15:10:03 +08:00
    pm2 的日志能看的东西比较多,也比较齐全,还有高亮
    lovedebug
        9
    lovedebug  
       2023-05-22 15:11:53 +08:00
    k8s + docker 化部署的
    zenxds
        10
    zenxds  
       2023-05-22 15:13:43 +08:00
    不应该是 docker 里面跑 pm2-runtime 吗[狗头]
    Trim21
        11
    Trim21  
       2023-05-22 15:15:14 +08:00 via Android
    docker ,还能顺便避免依赖问题
    coderxy
        12
    coderxy  
       2023-05-22 15:20:29 +08:00
    docker 比较好,因为 docker 还能保证实现线上版本控制, 而且后期如果上 K8s 也方便
    zjsxwc
        13
    zjsxwc  
       2023-05-22 15:26:18 +08:00
    要保活,不就 linux 自带的 systemd 加 1 行
    Restart=always
    就行了嘛。

    花式根据 exit code 来保活 得看文档里这个 Restart 参数: http://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart=
    vueli
        14
    vueli  
       2023-05-22 15:26:38 +08:00
    pm2 再加自带的多线程
    zqguo
        15
    zqguo  
    OP
       2023-05-22 15:27:57 +08:00
    @smallWang #5 我的需求是无论是机器重启,还是因为什么原因进程挂了,都要常识启动,之前用了 docker compose 有个选项是 restart: always ,这个应该就是无论什么情况都会尝试重启。
    wu67
        16
    wu67  
       2023-05-22 15:37:41 +08:00
    你可以容器 restart always, 也可以在容器里面用 pm2, 不太确定是不是所有的 node 进程挂掉的时候容器也是挂掉的, 所以我建议容器里面跑 pm2.

    如果是测试环境, 其实直接在容器里面跑 node ***.js 就好了, 反正问题不大.
    zqguo
        17
    zqguo  
    OP
       2023-05-22 15:57:09 +08:00
    @wu67 正解
    zbinlin
        18
    zbinlin  
       2023-05-22 16:22:48 +08:00
    @wu67 什么情况下 node 进程挂掉了而容器没挂的?
    wu67
        19
    wu67  
       2023-05-22 16:35:08 +08:00
    @zbinlin nuxt 部分情况下出错导致整个服务 500 了, 但是容器还在 running...前端日常花式整活.
    freak118
        20
    freak118  
       2023-05-22 16:47:34 +08:00
    @wu67 如果把 nuxt 作为 express 的中间件来使用 还会出现这种情况吗
    zbinlin
        21
    zbinlin  
       2023-05-22 16:49:19 +08:00
    @wu67 这时候 node 没挂掉吧?
    wu67
        22
    wu67  
       2023-05-22 16:56:13 +08:00
    @freak118 不知道, 我都懒得折腾这些...这应该是框架开发这关心的情况, 我们开发这哪有那个时间去整这些, 光是搞业务就忙得要命了, 遇到这种极端情况最好的方法就是直接重启


    @zbinlin 你跟我杠这个也没什么意思呀, 反正作为框架用户, 我用起来整个 node 本身还有响应 500, 但是服务本身进入了非预期的响应状态, 刷新页面 /重调 API 也无法跳过, 那我说它挂了也不过分吧
    julyclyde
        23
    julyclyde  
       2023-05-22 17:27:04 +08:00
    pm2 没啥用
    你用 pm2 去管应用程序的死活,那 pm2 自己的死活谁来管呢?
    star7th
        24
    star7th  
       2023-05-22 17:31:19 +08:00
    要看你把项目部署到什么平台上。如果是直接部署到服务器,是推荐 pm2 .但是我一般都是封装成 docker 到 k8s 来运行,所以不需要 pm2
    makelove
        25
    makelove  
       2023-05-22 17:47:38 +08:00
    如果是自己的小项目,都不用,直接用 systemd 一切从简不好吗
    flyPig9527
        26
    flyPig9527  
       2023-05-22 22:14:54 +08:00
    @zenxds 正解,我现在就是这样做的
    libook
        27
    libook  
       2023-05-23 10:01:05 +08:00
    直接部署在系统上就用 pm2 ,或者使用 systemd ;已经有 docker 环境就用 docker 。没啥好不好的,看你具体情况。
    121819756
        28
    121819756  
       2023-05-25 21:47:18 +08:00
    @wu67 我用 nuxt PM2 nginx 部署的话,重启会有 502 的情况,请问大佬您知道为啥吗
    wu67
        29
    wu67  
       2023-05-26 09:03:18 +08:00
    @121819756 我萌新来的. 我们网站的用户量不大, 所以也没见过你说的这种问题.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1422 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 16:50 PVG 00:50 LAX 08:50 JFK 11:50
    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