华丽的蜕变,放弃node-forever 改用 pm2

因为我的博客是ghost,基于node的,所以关闭shell的之后需要有额外工具来帮住守护住 ghost的 进程,不然一旦shell关闭 博客也就无法访问了。
之前我一直使用的forever来守护ghost的进程,然而forever虽然诞生的早,稳定性相对高一些,但是也会有一些不足的地方,比如说如果我用forever守护了多个进程的时候,我使用

forever list

来查看所有进程,得到的结果是这样的:

进程是都列出来了,但是。。。forever没有提供一个 查看单个进程详情的功能,这TM就很尴尬了,当进程一多之后,鬼知道哪个是哪个?

如果我想知道当前forever所有进程的资源消耗情况也没有相应的功能……

虽然说以上提到的2点其实对一般的个人站长而言没啥卵用,但偶尔需要的时候真心捉鸡蛋疼。

而后来一次偶然的机遇 让我遇到了[pm2][1]……遂 google bing baidu之。。。

pm2诞生的比forever晚,在pm2的开发团队眼中,forever存在以下几点缺陷

  • log 和监视的功能有限\n* 进程和集群管理有限
  • Aging codebase (升级 Node 容易导致应用失败)

pm2 VS forever

Feature Forever PM2
Keep Alive
Coffeescript
Log aggregation
API
Terminal monitoring
Clustering
JSon configuration

可见 pm2着实比forever更强大

对于pm2的安装 我想不必多说了,但还是意思意思提一下

npm install pm2 -g

在用法上跟forever几乎差不多

常用命令总结如下:

  • 启动应用
pm2 start app.js
  • 列出所有应用
pm2 list
  • 查看资源消耗
pm2 monit
  • 查看某一个应用状态
pm2 show [app id]
  • 查看所有日志
pm2 logs
  • 重启应用
pm2 restart [app id]
  • 停止应用
pm2 stop [app id]
  • 开启api访问
pm2 web

更多pm2内容请参考官方文档[2]

对于Ghost的启动

之前我们使用forever的时候要在服务器上部署Ghost使用如下命令

NODE_ENV=production forever start index.js

而现在我们换成PM2的话命令其实是一样的,只是把forever改成pm2

NODE_ENV=production pm2 start index.js

PM2特色

  1. 图形化列表页 pm2 list

  2. 进程详情 pm2 show <id|name>

(妈妈再也不用担心我因为进程太多而不知道谁是谁啦)
3. 查看资源消耗 pm2 monit

4. 强大的API pm2 web

(你猜会发生什么?打开你的浏览器看看?)
==前方高能!!!====前方高能!!!==前方高能!!!

把部署的服务器的信息和程序的信息都显示出来了,这东西对程序运行的监控页面的开发那是相当有帮助!

缺点

刚才介绍了那么多好处,当然pm2并不是那么十全十美的,

  1. pm2的内存占用肯定比forever高那么一丢丢,毕竟它功能多了不少,
  2. 据说 pm2 有一大堆的小坑
  3. 有网友表示 pm2 stop 的之后 进程关闭但是端口依然占用,要使用pm2 kill才能彻底关闭进程并释放端口,但是,pm2表示这个锅我们不能背!在pm2的github issue#74[3] 中有提及,归根到底是因为 == pm2 的 cluster 用的是 node 自带的 cluster 模块 ==,所以这个锅要扔给 Nodejs,而问题的根本是出在 node v0.10.x上,这个版本的 cluster模块自身有问题 所以才导致了 进程结束而端口依旧占用的bug,而其他版本的 node 暂时没发现类似问题,至少v0.8.x v0.11.x v4.x是没问题的~

总结

其实没什么总结~

总之pm2forever孰优孰劣也就见仁见智了吧~ 看个人喜好而已~
我是颜控,所以我最终选择了pm2,但是forever这么多年也不是白活的

P.S 额外的补充资料:

  • ubuntu 查看 node所占用的 系统端口 情况命令:
ps -aux | grep node

  1. PM2官网:http://pm2.keymetrics.io/ ↩︎

  2. 官方文档:http://pm2.keymetrics.io/docs/usage/quick-start ↩︎

  3. pm2 github issue#74: https://github.com/Unitech/pm2/issues/74 ↩︎