一直以来,没有机会在商业项目、网站上正式用起来NodeJS,说起来挺遗憾的,最近公司网站重构,同时为了配合做些SEO优化,经过一系列筛选后选择了使用NodeJS来支撑前端展现。

在刚接触NodeJS时,也像很多人一样,想问有没有针对NodeJS的热部署方案,后面发现windows下使用nodemon挺好用,但只是简单的自动重载,似乎放到网站上有些不够用,看到翻译后的express官网有介绍进程管理器StrongLoop Process Manager、PM2和Forever,StrongLoop Process Manager是IBM一家子公司维护的,不过国内没见太多人用,大部分都是选择Forever或者PM2(似乎现在PM2使用率更高),对比后选择了PM2。

PM2 是一个带有负载均衡功能的 Node 应用的进程管理器。使用它,可以充分利用CPU多核优势,让你的NodeJS程序完全应用服务器CPU,并且可以保证进程”永远在线”,同时,可以实现0秒重载等。

PM2主要特性如下:

1、内建负载均衡(使用 Node cluster 集群模块)
2、后台运行
3、0 秒停机重载,因为带了有负载均衡功能,可以使用pm2 gracefulReload app来实现平滑重载
4、具有 Ubuntu 、CentOS等启动脚本,可以简单实现开机自动启动
5、停止不稳定的进程(避免无限循环)
6、控制台检测
7、提供 HTTP API
8、远程控制和实时的接口 API ( Nodejs 模块,允许和 PM2 进程管理器交互 )

安装:

npm install pm2 -g

使用:

$ npm install pm2 -g # 命令行安装 pm2
$ pm2 start app.js -i 4 # 后台运行pm2,启动4个app.js ,也可以把'max' 参数传递给 start,正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 list # 显示所有进程状态
$ pm2 monit # 监视所有进程
$ pm2 logs # 显示所有进程日志
$ pm2 stop all # 停止所有进程
$ pm2 restart all # 重启所有进程
$ pm2 reload all # 0 秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0 # 停止指定的进程
$ pm2 restart 0 # 重启指定的进程
$ pm2 startup # 产生 init 脚本 保持进程活着
$ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程

此外,pm2提供了很多可选参数用于配置你的服务启动模式等,为了方便使用,pm2还提供了json或者yml形式的配置文件启动。

使用方式如

pm2 start run.json

比如我的项目,建立配置如下

{

"apps": [

{

"name": "test",

"script": "bin/www",

"env": {

"DEBUG": "server:*",

"NODE_ENV": "development",

"NODE_MODE": "debug",

"PORT": 3000

},

"watch": [

"protected"

],

"kill_timeout": 3000,

"max_memory_restart": "70M",

"instances": "2",

"exec_mode": "cluster"

},

{

"name": "beta",

"script": "bin/www",

"env": {

"DEBUG": "server:*",

"NODE_ENV": "beta",

"NODE_MODE": "build",

"PORT": 3001

},

"watch": [

"protected"

],

"kill_timeout": 3000,

"max_memory_restart": "70M",

"instances": "2",

"exec_mode": "cluster"

},

{

"name": "prod",

"script": "bin/www",

"env": {

"NODE_ENV": "production",

"NODE_MODE": "build",

"PORT": 3002

},

"watch": [

"protected"

],

"kill_timeout": 3000,

"max_memory_restart": "150M",

"instances": "max",

"exec_mode": "cluster"

}

]

}

在各大网站翻译的文章中,基本都是从官网拷贝了配置文件加以注解,和上面配置文件一样,默认有多个app,其实这里面配置数组假如一个弊端,就是如果想通过不指定任何参数来运行,就必须同时启动所有app,这自然是不完美的,当然,像我这样配置了三个,启动的时候可以选择追加参数—only指定启动某个app,或者直接写shell指定参数,但这样以来,倒不如分开写多个json文件,比如以上配置分割为test.json、beta.json和prod.json。

参考资料

PM2 Github地址:https://github.com/Unitech/pm2

PM2 官网:http://pm2.io/

这里仅分享下个人见解,如有出入,欢迎拍砖。