Nodejs在生产环境中修改代码后可不可以不重启Nodejs而运行新的代码?

Nodejs在生产环境中修改代码后可不可以不重启Nodejs而运行新的代码?

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

12 回复

标题:Nodejs在生产环境中修改代码后可不可以不重启Nodejs而运行新的代码?

内容: 在生产环境中,频繁地重启服务可能会导致用户体验下降,甚至可能造成业务中断。对于这个问题,Node.js 提供了一些方法来实现热更新(Hot Reload),即在不重启 Node.js 进程的情况下应用代码更改。

使用 nodemonpm2

最简单的方法之一是使用像 nodemonpm2 这样的工具。这些工具可以在检测到文件变化时自动重启 Node.js 应用程序。

示例:使用 nodemon

  1. 安装 nodemon
npm install -g nodemon
  1. 修改启动命令,使用 nodemon 代替 node
nodemon app.js

app.js 发生更改时,nodemon 会自动重启应用。

示例:使用 pm2

  1. 安装 pm2
npm install -g pm2
  1. 使用 pm2 启动应用:
pm2 start app.js --name my-app
  1. 设置自动重启:
pm2 reload my-app

使用 hot-reload 模块

如果你需要更细粒度的控制,可以考虑使用专门用于热更新的模块,例如 hot-reload

  1. 安装 hot-reload
npm install hot-reload
  1. 在应用中启用热更新:
const hotReload = require('hot-reload');
hotReload.init();

// 你的应用代码...

结论

虽然 Node.js 本身并不直接支持热更新,但通过上述工具和模块,你可以实现这一功能。在生产环境中使用这些工具时,请确保它们不会对性能产生负面影响,并且在生产环境中进行充分测试。

希望这些建议对你有所帮助!


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

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

npm install supervisor才是正道

然后用gulp的watch + livereload

完美

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

在Node.js的生产环境中,直接修改代码后是不能立即生效的,因为Node.js进程需要加载代码并执行。不过,有一些方法可以在不重启Node.js应用的情况下让修改后的代码生效。

一种流行的方法是使用热重载(Hot Reloading)技术,这通常通过专门的库或框架来实现。Sails.js 本身支持热重载,但可能需要一些额外的配置。

以下是一些可以使用的库:

  1. Nodemon: 这个库可以在代码发生变化时自动重启Node.js应用。虽然它不会实现真正的热重载,但可以减少手动重启的麻烦。

    npm install --save-dev nodemon
    

    使用方法:

    "scripts": {
      "start": "nodemon app.js"
    }
    
  2. PM2: PM2 是一个强大的进程管理器,可以用来保持应用始终在线,并且支持热重载功能。

    npm install pm2 -g
    

    使用方法:

    pm2 start app.js
    pm2 reload app
    
  3. Sails.js 特定配置: 如果你在使用Sails.js,可以启用热重载功能。在开发模式下,Sails.js 会自动进行热重载。

    sails lift
    

    如果是在生产环境中,可以通过配置PM2来实现类似的效果:

    pm2 start ecosystem.config.js --env production
    

在上述方法中,Nodemon 和 PM2 是两种常见的工具,可以帮助你在开发过程中更高效地调试代码,但在生产环境中,更推荐使用PM2来确保应用的稳定性。对于Sails.js,可以利用其内置的开发模式特性来实现热重载。

回到顶部