node.js在生产环境中修改代码后可不可以不重启node.js而运行新的代码?
发布于 10 年前 作者 fsrm365 31439 次浏览 最后一次编辑是 8 年前 来自 问答

比如PHP,修改了代码然后上传覆盖旧的代码,打开浏览器访问页面就立马能看到修改。而node.js呢?正在学习sails.js,发现修改代码后要ctrl+C结束后再次运行才行。。 开发环境当然没有问题,但是在生产环境中这样可不行,有没有什么办法或工具解决呢??本人初学node.js,希望大家不要拍砖

13 回复

pm2 forever lots of them

那也是重启。开发环境用eval+数据库存函数

热升级嘛,哈哈到时nodeparty就讲讲这个

生产环境下 pm2 reload all

严谨的php生产环境一般也是不直接做线上覆盖的, 毕竟多个文件之间的修改不是原子的, 而且热部署下opcode缓存未刷新或者部分刷新也有很大可能会导致一些其他问题.

fs模块有个watch 我有个新思路还没实现 fs watch (路由文件夹/函数文件夹) 污染一个global全局。类似于global.func={},global.rout={} 将路由注册进global.rout,函数注册进global.func 当fs.watch事件触发 global.rout和global.func重加载

比较靠谱的还是用nginx做反向代理和负载均衡。每个Node.js服务器实例接收到SIGTERM信号后,不再接收新请求,等待现有请求处理完毕,结束执行。然后再用新代码重启这个Node.js服务器实例。

zero downtime deployments with nginx

@bnuhero 正解, 反向代理搞定. 等没有在处理的request, kill self.

nginx 这个方案听起来不错 可以配合 pm2 使用

npm install supervisor才是正道

然后用gulp的watch + livereload

完美

nodejs 本身不支持热更新,因为所有的js代码都被编译和缓存进内存了,你覆盖原有代码对已经运行的服务无影响。像某些模块可以做livelode的都是通过代理和注入,我个人不是很推荐。还是老老实实重启吧,有pm2的话也花不了多长时间。

回到顶部