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

node js 应用部署,一定要停机,才能 npm install 么?

  •  
  •   aaronhua · 332 天前 via Android · 3688 次点击
    这是一个创建于 332 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我是 Python 开发,不是很懂前端的生态。同事部署 nodejs 应用,他需要停机半个小时更新依赖。说是不停机,会影响全局的 npm 搜索依赖。在我看来这个同事技术很不错的,很多技术问题跟他沟通都很流畅。但是,结果就是服务中断,等依赖更新完。小项目就部门内几十个人用,没有用 docker ,Jenkins ,基本上怎么简单怎么来。求证下是这样的么?还是说忽悠我谢谢。
    39 条回复    2023-04-22 22:55:36 +08:00
    amery2010
        1
    amery2010  
       332 天前
    pm2 了解一下,能满足你的需求
    https://pm2.keymetrics.io/

    用 node 项目不清楚 pm2 看来还是没什么服务端的开发经验
    aaronhua
        2
    aaronhua  
    OP
       332 天前 via Android
    @amery2010 服务启动用的就是 pm2
    CHTuring
        3
    CHTuring  
       332 天前
    如果是后端 node.js 的话,确实是要安装依赖。

    但是常规操作就是更新依赖,打包,运行。

    半个小时应该不用吧
    hanai
        4
    hanai  
       332 天前 via iPhone
    应该用 docker 的,并不会复杂很多。
    cosmtrek
        5
    cosmtrek  
       332 天前
    用 docker 封装一下省心
    aaronhua
        6
    aaronhua  
    OP
       332 天前 via Android
    每次都是先新建目录,上传打包的代码,然后 pm2 stop 应用,再 npm install ,最后再新建 pm2 进程。就不能先 npm install ,然后再新建 pm2 进程,这样就不会中断服务这么久。用 package.json 锁定了依赖的大版本,小版本,让 npm 自动更新。说是不停机,小版本更新不了,或者会报错。
    amery2010
        7
    amery2010  
       332 天前
    pm2 可以可以配置自动部署的,配置一下 deploy 参数,可以做到不停机更新
    aaronhua
        8
    aaronhua  
    OP
       332 天前 via Android
    @CHTuring 其实我不明白的一点是,一定要停了服务才能更新依赖么?不能先更新依赖,打包,停服务,再运行么?
    CHTuring
        9
    CHTuring  
       332 天前
    @aaronhua 如果是用上 pm2 了,那不需要这么复杂。
    old9
        10
    old9  
       332 天前
    一般没有动态加载的模块,不需要停服务
    aaronhua
        11
    aaronhua  
    OP
       332 天前 via Android
    我也用 pm2 ,看来我跟他还没有完全搞懂 pm2😂
    aaronhua
        12
    aaronhua  
    OP
       332 天前 via Android
    @amery2010 谢谢,我去了解一下
    estk
        13
    estk  
       332 天前
    可以检测 github 新版本,服务器自动部署呀。。
    weijancc
        14
    weijancc  
       332 天前
    这个感觉是运维有点问题吧, node 程序安装依赖是可以停机的
    raighne
        15
    raighne  
       332 天前
    ```shell
    npm I
    pm2 kill xx && pm2 start xxx
    ```
    不行么
    makelove
        16
    makelove  
       332 天前
    从来都是直接 npm install 再 restart node 进程,还没碰到过坑

    另外半小时也是离谱,这 npm install 更新下不就一分钟的事?
    yhxx
        17
    yhxx  
       332 天前
    可以停的
    或者再简单一点,docker 打个新镜像,打完之后服务指到这个新镜像上,再把旧的销毁
    wu67
        18
    wu67  
       332 天前
    半小时有点离谱. 我的都是 3 到 6 分钟.
    kongkxyang
        19
    kongkxyang  
       332 天前 via iPhone
    soft link + 版本目录 不能解决问题?
    mozhizhu
        20
    mozhizhu  
       332 天前
    还是建议 docker ;当前版本崩了,大 BUG 了,还能后退;直接运行的服务,除非是长期不变的项目;
    IvanLi127
        21
    IvanLi127  
       332 天前 via Android
    一般不需要停就能装依赖。不过 node js 的应用,可以做热更新,也可以没做热更新,一般项目是没做热更新支持的,会停机更新是很正常的。。。没必要纠结这个,即使人家敢冒风险停服更新,出事了谁负责。。。
    markgor
        22
    markgor  
       332 天前
    自己停机维护时间 = 预估需要时间 * 1.5 取整小时为单位。
    一切顺利的话发多个公告 经过.....提前....完成任务。

    别人停机时间 = 10 分钟???不就重启下就好了吗
    aaronhua
        23
    aaronhua  
    OP
       332 天前 via Android
    @makelove 内网镜像慢,这个就没法解决
    themostlazyman
        24
    themostlazyman  
       332 天前
    前面加个 nginx ,新版本换个目录换个端口。部署完还能先测试下,前提是两个版本兼容,表没变化,或表变化不影响当前版本使用。
    opengg
        25
    opengg  
       332 天前
    你们不上集群、容器、load balancer 的吗?
    单机裸跑?
    learningman
        26
    learningman  
       332 天前
    写个 dockerfile 才几行啊
    aaronhua
        27
    aaronhua  
    OP
       332 天前 via Android
    @IvanLi127 说真的,还真的有点纠结。知道其实可以做到也不纠结了。
    @weijancc 就那么几个开发没有运维。
    makelove
        28
    makelove  
       332 天前
    @aaronhua 网络慢就本地预缓存一下,复制下 package.json 到临时目录先安装一下,再安装生产目录的
    xuanbg
        29
    xuanbg  
       332 天前
    为啥更新依赖要停机?新版本的依赖包就不能正常发布么?实在是摸不着头脑
    aaronhua
        30
    aaronhua  
    OP
       332 天前 via Android
    @opengg 是的,用户是部门的人,才几十个人。单机没有压力。系统蹦一阵子没人察觉的那种。😂要是,停机比较长,领导就会来找我。
    zhangxh1023
        31
    zhangxh1023  
       332 天前
    既然是几十个人用,怎么简单怎么来,估计也是为了防止出问题吧,停会儿也没啥问题,懒得折腾
    aaronhua
        32
    aaronhua  
    OP
       332 天前 via Android
    @zhangxh1023 是的,躺平
    isbase
        33
    isbase  
       332 天前
    上容器吧
    chronos
        34
    chronos  
       332 天前
    node 项目如果不用 docker 的话,用下面的步骤应该能快很多。

    1. 将新版本程序放置到服务器同磁盘其它目录中,比如原来的 server 在 /opt/server ,那么你可以先将新版本的程序放到 /opt/server_new
    2. 在 /opt/server_new 中使用 npm 安装依赖,并等待依赖安装完毕
    3. 停机,并将 /opt/server/node_modules 重命名为 /opt/server/node_modules_old
    4. 将 /opt/server_new/node_modules 移动到 /opt/server/node_modules
    5. 将 /opt/server 的其它文件,一般也就是程序文件更新到新版本。如果用上了 git 这一步就直接 git pull 。
    6. 启动 server ,检测是否正常运行。
    7. 删除 /opt/server/node_modules_old

    因为这个过程中 npm 安装依赖时不需要先停机,所以基本也就是个重启应用的时间。
    Pythoner666666
        35
    Pythoner666666  
       332 天前   ❤️ 2
    没你们说的那么麻烦 ,git pull, npm i , pm2 reload 结束
    DICK23
        36
    DICK23  
       332 天前
    你同事顺序搞反了吧。直接整负载均衡,单机切个端口的事
    libook
        37
    libook  
       331 天前
    用了快 10 年 Node.js ,从 9 年前就手动实现绝大多数情况下不停机上线了,大公司也有自动化灰度 CI/CD 能力,现在云原生完全自动化更简单了。

    npm install 跟 pip install 基本上是一样的;区别在于 npm 会安装到项目目录下,pip 会安装到全局目录下; npm 允许同一个包在不同项目下甚至相同项目的不同依赖层级下使用不同版本,pip 默认不提供这种能力。
    两者同样 import 过的包都需要重启重新 import 才能载入新的包,除非 hack 一些热更新方案。

    题主这个同事要么是有其他原因需要停机,要么就是技术水平还不行。
    morning
        38
    morning  
       310 天前
    大概说下之前公司的自动化 CD 流程,首先需要一台打包机,环境配置跟生产机器一致,在打包机部署打包后分发到生产机器比如 /release/20230421 软链 到 /current ,然后切 IP ,关闭旧服务,启动新部署的服务,检查服务状态,成功后切回 IP

    或者上 docker
    jason118822
        39
    jason118822  
       309 天前
    如果 nodejs 更新的业务代码刚好是新加的依赖,不用 docker 话,确实会出现报错,但半小时太离谱了。不用 docker 通常做法,git pull && npm i && pm2 reload xxx ,就能完成更新,通常一分钟不到
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5731 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:44 · PVG 09:44 · LAX 17:44 · JFK 20:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.