forever是一个简单的命令式nodejs的守护进程,能够启动,停止,重启App应用。forever完全基于命令行操作,在forever进程之下,创建node的子进程,通过monitor监控node子进程的运行情况,一旦文件更新,或者进程挂掉,forever会自动重启node服务器,确保应用正常运行。
具体forever的用法可以参考:https://www.jianshu.com/p/669a618f3212
下面的文章介绍的是我在express4.x中使用forever遇到的坑。
1、使用forever start后没有用
使用上述命令可以看到成功了启动了app.js,然后我访问127.0.0.1:3000,结果是无法访问,说明项目根本没起来
我使用npm start项目就可以了。
然后我发现用npm start之后,会有一个提示:
原来4.x其实是使用的node ./bin/www来启动的,直接使用node app.js是无法启动程序的,于是改下我的命令
再次访问127.0.0.1:3000,OK了。
并且,由于我们使用了-w选项,可以使我们在修改代码之后无需重启便可以让代码生效了,因为-w选项会监控代码的变化,有变化会自动重启。
2、-w引起的问题
如上,我使用了-w自动检测代码变化,并自动重启。结果,出现了一个意外情况。因为我的项目做了日志记录功能,开发环境下会自动记录访问请求,sql日志和错误日志,导致每次访问,项目中的日志文件都会变化,导致forever不断重启不断重启,最后直接停止了项目。
所以,我把项目中的日志文件关闭了,项目启动就没问题了。
所以,要慎用-w选项。我的建议:线上模式不要加-w,以防不必要的重启。开发模式加-w,以便每次修改代码之后,自动重启,就不用每次都手动重启了。
3、重启次数限制
-m选项可以配置重启次数限制。我的建议是上线初期是可以使用的,如果一个项目一直在重启,那么肯定是有未捕获的异常之类的造成的,并且比较频繁,必须对此问题重视,而不是不断重启项目,宁愿项目停掉,通过错误日志找出问题之后再启动项目,不然可能会产生无法预计的损失。
当然,也可以采用全局捕获异常,然后通过邮件发送等形式立即通知开发人员,及时处理异常。
最重要的,当然是要保证系统的健壮性,更加合理的处理异常。可参考https://zhuanlan.zhihu.com/p/22814642?refer=leancloud-eng
