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

关于 node 项目部署问题。

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

    请教下大家,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   ·   实用小工具   ·   2875 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 08:29 · PVG 16:29 · LAX 00:29 · JFK 03:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.