PM2简介
PM2(Process Manager 2)是一个基于Node.js开发的应用进程管理器,支持多种脚本语言(ruby,python,bash等等)
提供了性能/进程实时监控,负载均衡(仅限于node.js),自动重启,日志管理等等。
PM2重要特性
1.内建负载均衡(使用Node cluster 集群模块、子进程)
2.线程守护,keep alive
3.0秒停机重载,维护升级的时候不需要停机.
4.Linux (stable) & MacOSx (stable) & Windows (stable).多平台支持
5.停止不稳定的进程(避免无限循环)
6.控制台实时监测运行情况
7.提供 HTTP API
8.远程控制和实时的接口API (Nodejs 模块,允许和PM2进程管理器交互 )
9.模块拓展机制
安装
npm install pm2 -g
命令列表
1.启动/引导管理
- pm2 startup 开机自启动(自动检测init系统+在服务器启动时生成并设置PM2启动)
- pm2 startup [platform] 手动指定启动系统,可以是:systemd,upstart,launchd,rcd
- pm2 unstartup 在服务器启动时禁用并删除PM2引导
2.进程信息管理
- pm2 save 在重新启动时保存/冻结进程列表
- pm2 resurrect 重载保存的应用列表
- pm2 update 保存进程,杀死pm2进程,恢复保存的进程
- pm2 init ### Generate a sample js configuration file
3.全局命令
- pm2 start app.js 启动并守护进程,重启Node应用
- pm2 satrt app.py 启动并守护进程,重启Python应用
4.集群模式 (仅限Node应用程序)
- pm2 start app.js -i 4 在集群模式下启动4个应用实例,自动分配请求给每个实例,实现负载均衡
- pm2 scale [app-name] 10 将集群应用实例缩放到10个
- pm2 scale [app-name] +10 增加10个应用进程
5.进程监控
- pm2 list/ls 列出所有已启动的进程(应用实例)
- pm2 list --sort= 列出指定字段的进程信息
- pm2 monit 显示每个进程的内存以及cpu使用情况
- pm2 show [app-name] 显示指定进程的所有信息
6.日志管理
- pm2 logs 显示所有应用实例的日志信息
- pm2 logs [app-name] 显示指定应用实例的日志信息
- pm2 logs --json 日志信息以JSON格式显示
- pm2 flush 清除所有的l日志信息
- pm2 reloadLogs 重载所有的日志信息
7.进程状态管理
- pm2 start app.js --name="api" 启动应用并给应用命名api(注:应用名称可以自定义)
- pm2 start app.js -- -a 34 启动应用并传递参数"a 34"
- pm2 start app.js --watch 监听项目文件变化,当文件发生变化时重启应用
- pm2 start app.json 使用配置文件方式启动应用
- pm2 reset [app-name] 重置所有应用的计数器
- pm2 stop all 停止所有的应用
- pm2 stop 0 停止id为0的应用进程
- pm2 restart all 重启所有应用
- pm2 reload all 0秒停机重载应用
- pm2 gracefulReload all 集群模式下优雅地重启所有应用
- pm2 delete all 终止并删除所有的应用进程
- pm2 delete 0 终止并id为0的应用进程
- pm2 kill 杀掉所有pm2管理的应用进程
8.应用部署
- pm2 deploy app.json prod setup 通过配置文件给远程服务器(生产环境)部署项目
- pm2 deploy app.json prod 通过配置文件给远程服务器(生产环境)更新已部署项目
- pm2 deploy app.json prod revert 2 ### Revert "prod" remote server by 2
9.模块系统
- pm2 module:generate [name] 创建一个模块并且命名
- pm2 install pm2-logrotate 安装模块
- pm2 uninstall pm2-logrotate 卸载模块
- pm2 publish 模块版本增量发布到git或者npm中(当模块做了更新,通过该命令推送发布更新)
实践部分
1.安装 在服务器全局安装(根据项目需求也可以局部安装pm2),执行 npm install pm2 -g(局部安装无需加-g)
2.PM2配置
命令行配置方式:pm2 start [option] 例如:pm2 start /path/app.js --watch -i 4 -save
path:表示项目入口文件所在的目录
--watch:表示监控整个项目文件的变化,一旦变化发生就重启应用
-i 4 :表示使用集群模式,开启4个项目实例进程
-save:保存项目列表信息,用于重载
更多配置可参考上面的命令列表
下面以启动一个koa2项目为例,调取控制台输入命令 pm2 start ./bin/app.js --watch,按下enter键。
到这里,使用pm2启动管理一个项目的部已经完成。
配置文件方式:(支持.yml , .json , .config.js 结尾的配置文件启动)
这里我们把配置文件命名为pm2.config.js,完整配置如下:(可根据项目实际需求进行删减)
module.exports = {
"apps": [{
"name": "koaServer", //项目名称
"cwd": './bin/', //应用的启动路径
"script": "app.js", //应用的启动文件
"exec_mode": "cluster", //可选值fork,cluster(开启集群模式实现负载均衡),默认fork
"instances": "max", //集群模式下启动实例个数,当值为0或者max,启动进程数量为CPU线程数
"args": "", //传递给脚本的参数
"interpreter": "node", //指定的脚本解释器,默认node
"interpreter_args": "", //传递给解释器的参数
"watch": ['controllers', 'bin'], //监听变化,重启应用。默认true,监听整个项目,false不启用监听,也可指定监听文件夹
"ignore_watch": ["node_modules", "logs", "static"], //忽略监听的文件夹,支持正则表达式
"log_date_format": "YYYY-MM-DD HH:mm:ss", //设置日志的时间格式
"log_type": "json", //输出的日志信息为json格式
"error_file": "./logs/system/error/error.log", //设置标准错误流日志要写入到哪个文件,代码错误可在此文件查找
"out_file": "./logs/system/output/console.log", //设置标准输出流日志要写入到哪个文件,如应用的console.log()
"pid_file": "./logs/system/pid/pid.log", //设置pid要写入到哪个文件
"min_uptime": 60, //应用运行少于时间被认为是异常启动
"max_restarts": 10, //最大异常重启次数,即小于min_uptime运行时间重启次数
"max_memory_restart": "100M", //最大内存限制数,超出自动重启
"autorestart": false, //默认为true,发生异常的情况下自动重启
"cron_restart": "", //crontab时间格式重启应用, 目前只支持cluster模式
"force": false, //默认false, 如果true, 可以重复启动一个脚本,pm2不建议这么做
"restart_delay": "100ms", //异常重启情况下,延时重启时间
"env": {
"NODE_ENV": "development"
}, //配置开发环境变量
"env_production": {
"NODE_ENV": "production"
}, //配置生产环境变量
}]
}
复制代码
3.PM2的监控
pm2 list/ls 显示PM2管理的所有应用的信息
pm2 monit 实时监控PM2管理的所有应用的信息
以上方式其实是存在也有缺点的,list方式没法实现实时监控,monit方式虽然可以实现实时监控,但是只能监控具体某一台服务器。
当使用多台服务器时(即服务器集群),不便于实现集中化监控管理且信息相对较少。因此,PM2官方推出了keymetrics监控用于对PM2服务进程的监控与管理
优点:
-
便于对于多台服务器(即服务器集群)进行集中监控管理
-
可以实时观察程序运行的稳定性
-
支持远程进行基本的管理操作,比如启动,停止,重启等等。
缺点:
-
该软件为商业付费软件,免费版本功能受限,且只有2台服务器免费配额且最多只能监控4个进程。
-
该软件的服务端非自建,采用的是将应用监控数据定时上抛给第三方平台,如服务器与进程有敏感信息存在一定的数据安全问题
选用指南:
-
服务器数量有限或者能够支付昂贵的使用费用且无需关心数据的安全问题可以选用Keymetrics,毕竟有官方团队开发维护,且特性功能丰富
-
此外,国内有大神开源一个PM2项目开源项目PM2.5,目前网上暂无相关部署使用教程,有兴趣可以点击这里了解下
4.fork模式与cluser模式的区别
- fork不支持socket地址端口复用,cluster支持地址端口复用
- fork不支持定时重启,cluster支持定时重启
- 为了实现最大的CPU资源利用,一般都采用cluser模式(仅限于node应用)
- fork模式下实现多进程可以使用创建多个应用,app0,app1,app2,每个应用映射到不同的端口
5.一些命令的区别
- resurrect:
- reload:
- stop:
- restart: