告别node-forever,拥抱PM2
告别node-forever,拥抱PM2
返回原文英文原文:Goodbye node-forever,hello PM2

devo.ps团队对JavaScript的迷恋已经不是什么秘密了;node.js作为服务器端,AngularJS作为客户端,某种程度上说,我们的堆栈是用它建成的.我们构建静态客户端和RESTful JSON API的方法意味着我们跑了很多的node.js,我必须承认尽管node.js的一切都令人敬畏,但当我们在生产环境中运行它时它仍然会让我们感到头疼.相比一些更加成熟的语言,它的工具和最佳实践仍然缺乏(试想一下:监控,日志,错误处理).
到目前为止,我们仍然依赖漂亮俏皮的node-forever模块.它是非常伟大的模块,不过依然缺失一些功能:
- 有限的监控和日志功能,
- 进程管理配置的支持差,
- 不支持集群,
- 代码库老化(意味着在升级node.js时频繁的失败).
这就是为什么我们要在过去的几个月里去写PM2模块.在我们即将发布针对生产环境的正式版之前我们想先让您看一眼.
PM2到底是什么个东西呢?
首先第一件事,你需要先通过 npm 来安装它:
npm install -g pm2
让我们通过表格来对比下:
| 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(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): https://github.com/Unitech/pm2.
我们开发的PM2提供了先进完整的Node进程管理解决方案.我们希望能有更多的人来帮助我们:更多的pull requests.一些还停留在开发路线图上面的功能我们会尽快完成,下面这些就是:
- 远程管理/状态校验,
- 嵌入式跨进程通信通道(消息总线),
- V8垃圾回收的内存泄漏检查,
- Web界面,
- 监控数据持久化,
- 邮件通知.
特别感谢 Makara Wang 的观点和工具,还有 Alex Kocharin 提的建议和提交的代码.
告别node-forever,拥抱PM2的更多相关文章
- Node.js使用PM2的集群将变得更加容易
介绍 众所周知,Node.js运行在Chrome的JavaScript运行时平台上,我们把该平台优雅地称之为V8引擎.不论是V8引擎,还是之后的Node.js,都是以单线程的方式运行的,因此,在多核心 ...
- [Whole Web, Nods.js, PM2] Passing environment variables to node.js using pm2
learn how to pass environment variables to your node.js app using the pm2 config file. This is usefu ...
- 最好用的koa2+mysql的RESTful API脚手架,mvc架构,支持node调试,pm2部署。
#基于webpack构建的 Koa2 restful API 服务器脚手架 这是一个基于 Koa2 的轻量级 RESTful API Server 脚手架,支持 ES6, 支持使用TypeSc ...
- node.js中pm2启动应用出错
在将公司的应用容器化时,遇到的问题. 之前,同事使用node.js 6版本运行,pm2启动js文件,一切正常. 但我一样将node.js 6版本安装,然后npm install pm2完成. 运行pm ...
- node工具之pm2
pm2 PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器.它使您可以使应用程序永远保持活动状态,无需停机即可重新加载它们,并简化常见的系统管理任务. 安装 npm install p ...
- 告别回调,拥抱async await
之前使用jquery中ajax,请求的结果需要写在回调函数里面,后面接触到了axios/fetch,使用了es6中Promise进行封装,这种链式结构调用,看起来比之前直观,可是还是没有解决回调的问题 ...
- React Native之iOS App打包
iOS打包步骤(一.二.三可不按照顺序) 步骤一: 选择iOS Device(以下两者选其中一个即可) 选择 Generic iOS Device (个人建议使用这个) 选择Generic iOS D ...
- node.js后台快速搭建在阿里云(二)(pm2和nginx篇)
前期准备 阿里云服务器 node.js pm2 express nginx linux(推荐教程:鸟哥的私房菜) 简介 嗯……我只是个前端而已 在第一部分说完了express篇. 后面继续项目的部署, ...
- 使用pm2 管理node服务后台运行
npm run dev的服务想放在服务器上,但是putty一断服务就没了. 网上差了下forever和pm2用的比较多,尤其是pm2 简直太好用了.. 具体操作如下 安装 npm install -g ...
随机推荐
- SQL Server 2005 中的同义词
From : http://blog.csdn.net/itblog/article/details/752881 =============创建同义词 可以为下列对象类型创建同义词: 程序集 (CL ...
- Ubuntu Install Chrome Brwoser
在ubuntu下安装chrome浏览器,可以直接从官网下载:http://www.google.cn/intl/zh-CN/chrome/browser/thankyou.html?platform= ...
- [转载] linux 速查表
原文: http://www.nixtutor.com/linux/all-the-best-linux-cheat-sheets/ 1. Linux Command Line Linux Refer ...
- poj2194Stacking Cylinders
链接 可以根据反余弦和反正切算出角a和b的值, 然后向量旋转就可以了,图中的状态旋转rotate((2,0),a+b) 反状态把角度反过来,点取(-2,0)即可. 不知道是不是理解错了,题意写着两圆 ...
- 数位dp——统计'1'的个数
今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错 ...
- hdu 1573 X问题
数论题,本想用中国剩余定理,可是取模的数之间不一定互质,用不了,看到网上有篇文章写得很好的:数论——中国剩余定理(互质与非互质),主要是采用合并方程的思想: 大致理解并参考他的代码后便去试试hdu上这 ...
- C++——string类和标准模板库
一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...
- oracle对象类型
Oracle的对象类型 对象类型 在PL/SQL中,面向对象的程序设计师基于对象类型来完成的.对象类型是用户自定义的一种复合数据类型,它封装了数据结构和用于操纵这些数据结构的过程和函数. 数据库的对象 ...
- bzoj2154(莫比乌斯反演)
又是一道经典题. 1.学习了下O(n) 的做法. // // main.cpp // bzoj2154 // // Created by New_Life on 16/7/7. // Copyrigh ...
- XMLHttpRequest cannot load – Origin is not allowed by Access-Control-Allow-Origin.
报错:跨域 XMLHttpRequest cannot load http://localhost:8080/yxt-admin/admin/store. No 'Access-Control-Al ...