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

发布于 1周前 作者 songsunli 来自 nodejs/Nestjs

我是 Python 开发,不是很懂前端的生态。同事部署 nodejs 应用,他需要停机半个小时更新依赖。说是不停机,会影响全局的 npm 搜索依赖。在我看来这个同事技术很不错的,很多技术问题跟他沟通都很流畅。但是,结果就是服务中断,等依赖更新完。小项目就部门内几十个人用,没有用 docker ,Jenkins ,基本上怎么简单怎么来。求证下是这样的么?还是说忽悠我谢谢。
Nodejs 应用部署,一定要停机,才能 npm install 么?

40 回复

pm2 了解一下,能满足你的需求
https://pm2.keymetrics.io/

用 node 项目不清楚 pm2 看来还是没什么服务端的开发经验


服务启动用的就是 pm2

如果是后端 node.js 的话,确实是要安装依赖。

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

半个小时应该不用吧

应该用 docker 的,并不会复杂很多。

用 docker 封装一下省心

每次都是先新建目录,上传打包的代码,然后 pm2 stop 应用,再 npm install ,最后再新建 pm2 进程。就不能先 npm install ,然后再新建 pm2 进程,这样就不会中断服务这么久。用 package.json 锁定了依赖的大版本,小版本,让 npm 自动更新。说是不停机,小版本更新不了,或者会报错。

pm2 可以可以配置自动部署的,配置一下 deploy 参数,可以做到不停机更新

其实我不明白的一点是,一定要停了服务才能更新依赖么?不能先更新依赖,打包,停服务,再运行么?

如果是用上 pm2 了,那不需要这么复杂。

一般没有动态加载的模块,不需要停服务

我也用 pm2 ,看来我跟他还没有完全搞懂 pm2😂

谢谢,我去了解一下

可以检测 github 新版本,服务器自动部署呀。。

这个感觉是运维有点问题吧, node 程序安装依赖是可以停机的

shell<br>npm I<br>pm2 kill xx &amp;&amp; pm2 start xxx<br>
不行么

从来都是直接 npm install 再 restart node 进程,还没碰到过坑

另外半小时也是离谱,这 npm install 更新下不就一分钟的事?

可以停的
或者再简单一点,docker 打个新镜像,打完之后服务指到这个新镜像上,再把旧的销毁

半小时有点离谱. 我的都是 3 到 6 分钟.

soft link + 版本目录 不能解决问题?

还是建议 docker ;当前版本崩了,大 BUG 了,还能后退;直接运行的服务,除非是长期不变的项目;

一般不需要停就能装依赖。不过 node js 的应用,可以做热更新,也可以没做热更新,一般项目是没做热更新支持的,会停机更新是很正常的。。。没必要纠结这个,即使人家敢冒风险停服更新,出事了谁负责。。。

自己停机维护时间 = 预估需要时间 * 1.5 取整小时为单位。
一切顺利的话发多个公告 经过…提前…完成任务。

别人停机时间 = 10 分钟???不就重启下就好了吗

内网镜像慢,这个就没法解决

前面加个 nginx ,新版本换个目录换个端口。部署完还能先测试下,前提是两个版本兼容,表没变化,或表变化不影响当前版本使用。

你们不上集群、容器、load balancer 的吗?
单机裸跑?

写个 dockerfile 才几行啊

说真的,还真的有点纠结。知道其实可以做到也不纠结了。
就那么几个开发没有运维。

网络慢就本地预缓存一下,复制下 package.json 到临时目录先安装一下,再安装生产目录的

为啥更新依赖要停机?新版本的依赖包就不能正常发布么?实在是摸不着头脑

是的,用户是部门的人,才几十个人。单机没有压力。系统蹦一阵子没人察觉的那种。😂要是,停机比较长,领导就会来找我。

既然是几十个人用,怎么简单怎么来,估计也是为了防止出问题吧,停会儿也没啥问题,懒得折腾

是的,躺平

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 安装依赖时不需要先停机,所以基本也就是个重启应用的时间。

没你们说的那么麻烦 ,git pull, npm i , pm2 reload 结束

你同事顺序搞反了吧。直接整负载均衡,单机切个端口的事

用了快 10 年 Node.js ,从 9 年前就手动实现绝大多数情况下不停机上线了,大公司也有自动化灰度 CI/CD 能力,现在云原生完全自动化更简单了。

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

题主这个同事要么是有其他原因需要停机,要么就是技术水平还不行。

大概说下之前公司的自动化 CD 流程,首先需要一台打包机,环境配置跟生产机器一致,在打包机部署打包后分发到生产机器比如 /release/20230421 软链 到 /current ,然后切 IP ,关闭旧服务,启动新部署的服务,检查服务状态,成功后切回 IP

或者上 docker

如果 nodejs 更新的业务代码刚好是新加的依赖,不用 docker 话,确实会出现报错,但半小时太离谱了。不用 docker 通常做法,git pull && npm i && pm2 reload xxx ,就能完成更新,通常一分钟不到

关于Node.js应用部署时是否需要停机才能进行npm install的问题,答案是否定的。在部署Node.js应用时,不需要停机就可以执行npm install。以下是对此问题的详细解答:

  1. npm install的作用: npm install是Node.js项目中用于安装项目所需依赖项的命令。它会根据package.json文件中列出的依赖项进行安装。

  2. 无需停机的安装: 在部署过程中,你可以通过以下方式避免停机:

    • 使用PM2等进程管理器来管理Node.js应用。PM2支持0秒停机重载,这意味着你可以在不停机的情况下更新应用代码和依赖项。
    • 在部署新代码之前,可以先在另一台服务器或容器上执行npm install,然后平滑地切换流量到新的服务器或容器上。
  3. 示例代码: 使用PM2启动Node.js应用的示例代码:

    pm2 start app.js
    

    其中,app.js是你的Node.js应用的入口文件。PM2会管理这个应用的进程,并确保它在崩溃时自动重启。

  4. 结论: 综上所述,Node.js应用部署时不需要停机才能进行npm install。通过使用PM2等进程管理器或采用容器化等技术,你可以实现应用的平滑更新和部署。

回到顶部