一直以来,没有机会在商业项目、网站上正式用起来NodeJS,说起来挺遗憾的,最近公司网站重构,同时为了配合做些SEO优化,经过一系列筛选后选择了使用NodeJS来支撑前端展现。
在刚接触NodeJS时,也像很多人一样,想问有没有针对NodeJS的热部署方案,后面发现windows下使用nodemon挺好用,但只是简单的自动重载,似乎放到网站上有些不够用,看到翻译后的express官网有介绍进程管理器
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 官网:
这里仅分享下个人见解,如有出入,欢迎拍砖。
上一篇: 我为什么选择Nunjucks作为NodeJS模板引擎 下一篇: 使用iptables限制访问网站指定端口