NodeJS 运行管理应用 PM2 介绍
NodeJS 作为服务器端,AngularJS 作为客户端,某种程度上说,我们的堆栈是用它建成的。我们构建静态客户端和 RESTful JSON API 的方法意味着我们跑了很多的 node.js,我必须承认尽管 node.js 的一切都令人敬畏,但当我们在生产环境中运行它时它仍然会让我们感到头疼。相比一些更加成熟的语言,它的工具和最佳实践仍然缺乏,试想一下:监控、日志、错误处理。
到目前为止,我们仍然依赖漂亮俏皮的 node-forever 模块。它是非常伟大的模块,不过依然缺失一些功能:
- 有限的监控和日志功能
- 进程管理配置的支持差
- 不支持集群
- 代码库老化(意味着在升级node.js时频繁的失败)
PM2 到底是什么个东西呢?
首先你需要先通过 npm 来安装它:
$ npm install pm2 -g
让我们通过表格来对比下:
Feature | Forever | PM2 |
---|---|---|
Keep Alive | ✔ | ✔ |
Coffeescript | ✔ | |
Log aggregation | ✔ | |
API | ✔ | |
Terminal monitoring | ✔ | |
Clustering | ✔ | |
JSON configuration | ✔ |
现在让我来介绍一点点主要特性。
原生的集群化支持
Node v0.6 引入了集群特性,允许你在多个 Node 应用中共享 socket,问题在于,它不能在容器外运行而且需要一些额外的配置来处理主进程和子进程。
PM2 原生支持处理这个问题,而且不需要额外的代码:PM2 本身作为主进程,然后它将你的代码封装到一个特殊的集群进程里,就像 node.js 一样,为你的代码文件添加一些全局变量。
想要启动一个使用所有CPU核心的集群,你只需要键入如下的指令:
$ pm2 start app.js -i max
然后:
$ pm2 list
然后就会显示类似下面的东西(ASCII UI FTW):
就像你看到的,现在你的应用有多少个进程就取决于你的 CPU 核心数了。
按照 termcaps-HTOP 的方式管理
termcaps-HTOP Linux下的系统监控与进程管理软件
通过 pm2 list 命令来观察所有运行的进程以及它们的状态已经足够好了。但是怎么来追踪它们的资源消耗呢?别担心,用这个命令:
$ pm2 monit
你可以得到进程(以及集群)的CPU的使用率和内存占用.
声明:node-usage 到目前为止还不支持 MacOS(随便什么性能要求),不过它在 Linux 下运行良好。
现在让我们来核实一下我们的集群,还有对内存堆栈的垃圾回收,我们假设你已经有一个 HTTP 基准测试工具(如果没有,你一定要使用WRK)
$ express bufallo //Create an express app
$ cd bufallo
$ npm install
$ pm2 start app.js -i max
$ wrk -c 100 -d 100 http://localhost:3000/
在另一个终端,运行监控选项:
$ pm2 monit
实时集中 log 处理
现在你不得不管理多个集群进程:一个爬取数据,一个处理数据,等等…,这就意味着大量 log,你可以按照老式的方法处理:
$ tail -f /path/to/log1 /path/to/log2 ...
但我们想的很周到,我们增加了 logs 功能:
$ pm2 logs
快速恢复
现在事情一切顺利,你的进程嗡嗡的运行着,你需要做一次硬重启(hard restart)。现在吗?是的,首先,dump 掉:
$ pm2 dump
然后,你可以从文件中恢复它:
$ pm2 kill //让我们假设一个PM2停掉了
$ pm2 resurect //我所有的进程又满血满状态复活了
强健的 API
比方说,你想要监控所有被 PM2 管理的进程,而且同时还想监控运行这些进程的机器的状态(甚至希望创建一个 Angular 应用来调用这些 API):
$ pm2 web
打开浏览器输入 http://localhost:9615
对了,还有很多特性…
- 全部测试通过
- 新一代的 update-rc.d(pm2 startup),当然它还是alpha版
- 开发模式下更改文件自动重启(pm2 dev),也同样还是草稿
- 自动刷新 log
- 快捷的通过 JSON 文件管理你的应用
- 在 error log 里记录未捕获的异常
- 记录重启的次数和时间
- 退出时自动杀死进程
下一步计划?
首先,你可以去 Github 上粉我们(我们喜欢 stars)。
我们开发的 PM2 提供了先进完整的 Node 进程管理解决方案。我们希望能有更多的人来帮助我们:更多的 pull requests,一些还停留在开发路线图上面的功能我们会尽快完成,下面这些就是:
- 远程管理 / 状态校验
- 嵌入式跨进程通信通道(消息总线)
- V8 垃圾回收的内存泄漏检查
- Web 界面
- 监控数据持久化
- 邮件通知
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论