前段时间发帖子问了一下关于nodejs热重启的问题,感谢论坛里几位活跃的朋友提点(coordcn,imacc等等,不一一列举了,原提问帖在这里:https://cnodejs.org/topic/552e06816966089a258141e0)。最近和同事一起研究了一下pm2,经过测试,pm2确实可以实现0 downtime,具体就是使用pm2的 reload外加cluster模式:
pm2 start app.js -i 1
按照pm2的文档,-i N是在cluster模式下启动N个worker。pm2的这个机制是对nodejs原生cluster的一个封装,不必自己写复杂的cluster代码,而直接由pm2管理cluster,还支持各大常见的框架(Express,koa等),真是太强大了,即便监听了某个端口或者unix socket文件,在pm2的管理下也不会出现EADDRINUSE的错误。
当需要更新代码的时候,只需调用pm2的reload命令即可:
// update the code
pm2 reload app.js
按照这篇文章https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/ 的提示:
PM2 reload <app name> feature will restart your workers one by one, and for each worker, wait till the new one has spawned before killing the old one.
This way, your server keeps running even when you are deploying the new patch straight to production.
在cluster模式下,pm2会尝试按顺序重启不同的worker,对于每个worker,只有在新的实例重启成功后才会杀死把旧worker杀死。所以reload的时候,还是可以保持服务一直能够响应,当reload结束后,新的worker已经开启,新代码就可以正常工作了。整个过程中,不会出现no responsing的问题。
@crystaldust 原理上就是前面有个 ngxin 负责处理静态文件,非静态文件的请求通过 proxy pass 到 express socket。 如此一来,后面的 express 死掉重启什么的,对前面静态文件是没有影响的,该304的还是304。 这种方式应该是复杂度最低的,而且也是推荐的生产环境布署方式。node.js 再快也快不过 nginx 处理静态文件的速度,各司其职。
具体如何弄有专门的文章讲如何布置的,貌似本社区就有,搜一下 nginx + express 可以看到很多。