PM2是Node.js生成环境中的进程管理工具,自带负载均衡功能。
它支持特性有:文件配置、集群模式、热加载、日志管理、系统监控、支持Docker、 启动脚本…等。

安装PM2:

1
$ yarn global add pm2

无缝更新PM2:

1
$ pm2 update

启动应用

PM2 中有两种方式启动应用,一种是直接调用应用入口文件,一种是通过调用配置文件启动应用。

命令行启动

1
$ pm2 start app.js --name "my-api"

上面命令通过调用 app.js 如果文件启动应用,并给这应用命名为 my-api

1
$ pm2 start app.js -i 0

上面命令会在启动应用同时使用了集群模式,创建了和CPU核数相同的进程。

1
$ pm2 start app.js -e err.log -o out.log

上面命令在启动应用的同时指定了错误和输出日志。

配置文件

PM2支持通过配置文件管理应用。在配置文件你可以指定环境变量、日志文件、进程文件,重启最大次数…等配置项。支持JSON和YAML格式。
例子,配置文件 processes.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"apps" : [{
"name" : "worker",
"script" : "./worker.js",
"watch" : true,
"env": {
"NODE_ENV": "development"
},
"env_production" : {
"PORT": 3000,
"NODE_ENV": "production"
}
},{
"name" : "api-app",
"script" : "./api.js",
"instances" : 4,
"exec_mode" : "cluster"
}]
}

上面在 apps 下配置了两个应用分别是 workerapi-app
调用 worder 命令如下:

1
$ pm2 start processes.json -only worker --env production

配置项

字段 类型 例子 描述
name string “my-api” 应用的名字,默认是脚本文件名
script string “./api/app.js” 脚本相对 pm2 start的相对路径
cwd string “/var/www/“ 指定应用启动的目录
instances number -1 应用启动的实例
exec_mode string “cluster” 应用启动模式,可以是”cluster”或”fork”
watch boolean or [] true 当目录文件或子目录文件有变化时自动重新加载应用
ignore_watch list [”[/\]./”, “node_modules”] list中的正则匹配的文件和目录有变化时不重新加载应用
max_menory_restart string “150M” 当应用超过设定的内存大小就自动重启
env object {“NODE_ENV”: “development”, “ID”: “42”} 传递给应用的环境变量
env_ object {“NODE_ENV”: “production”, “ID”: “89”} 命令行启动应用时 –env 参数调用的环境类型
log_date_format string “YYYY-MM-DD HH:mm Z” 日志时间格式
error_file string 错误文件的路径,默认: $HOME/.pm2/logs/XXXerr.log
out_file string 输出文件路径,默认:$HOME/.pm2/logs/XXXout.log
pid_file string pid文件路径,默认: $HOME/.pm2/pid/app-pm_id.pid
min_uptime string 程序最小运行时,运行这么长时间就认为应用启动过,否则认为异常
max_restarts number 10 应用异常重启最多次数
listen_timeout number 8000 设定的时间内如果应用没有被监听则强制重启(单位:毫秒)

进程监控

通过下面的命令可以查看已经启动的应用状态。

1
2
# $ pm2 ls
$ pm2 list

可以将进程列表以JSON格式打印出来:

1
2
$ pm2 jlist
$ pm2 prettylist

查看某个应用具体信息:

1
2
$ pm2 describe <id|app_name>
$ pm2 show <id|app_name>

监控所有进程CPU或内存使用情况:

1
$ pm2 monit

日志管理

1
$ pm2 logs ['all' | app_name | app_id ]

上面命令设置了输出所有日志信息或根据应用名称或app_id输出指定应用日志。

1
2
3
4
5
6
$ pm2 logs APP-NAME       # 显示 APP-NAME
$ pm2 logs --json # JSON 格式输出
$ pm2 logs --format # 格式化 output

$ pm2 flush # 清空所有日志文件
$ pm2 reloadLogs # 重新加载所有日志文件

部署

PM2提供了简单而功能强大的部署系统并支持代码版本追踪功能。

第一次进行PM2部署要做四步:准备好配置文件、本机生成ssh密钥、初始化远程目录、部署代码。

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{
// Applications part
"apps" : [{
"name" : "API",
"script" : "app.js",
"env": {
"COMMON_VARIABLE": "true"
},
// Environment variables injected when starting with --env production
// http://pm2.keymetrics.io/docs/usage/application-declaration/#switching-to-different-environments
"env_production" : {
"NODE_ENV": "production"
}
},{
"name" : "WEB",
"script" : "web.js"
}],
// 部署配置项 deploy
"deploy" : {
// 指定环境 production
"production" : {
"user" : "node", //登陆远程服务器的用户名
"host" : ["212.83.163.1", "212.83.163.2", "212.83.163.3"], // 远程服务器地址(可以是IP或域名)
"ref" : "origin/master", // 指定分支
"repo" : "git@github.com:repo.git", //git 克隆地址
"path" : "/var/www/production", // 远程服务器路径
"post-deploy" : "npm install && pm2 startOrRestart ecosystem.json --env production" // 在服务clone下来后执行的命令
// 注入到虽有应用中的环境变量
"env" : {
"NODE_ENV": "production"
}
},
// 指定环境 staging
"staging" : {
"user" : "node",
"host" : "212.83.163.1",
"ref" : "origin/master",
"repo" : "git@github.com:repo.git",
"path" : "/var/www/development",
"ssh_options": ["StrictHostKeyChecking=no", "PasswordAuthentication=no"],
"post-deploy" : "pm2 startOrRestart ecosystem.json --env dev",
"env" : {
"NODE_ENV": "staging"
}
}
}
}

本机生成ssh密钥

1
2
ssh-keygen -t rsa
ssh-copy-id node@myserver.com

初始化远程服务器文件夹

1
pm2 deploy <configuration_file> <environment> setup

例子:

1
pm2 deploy ecosystem.json production setup

部署代码

1
pm2 deploy ecosystem.json production

常用命令

1
2
3
4
5
pm2 restart <app id|app_name> # 重启应用
pm2 stop <app id|app_name> # 停止应用
pm2 list # 列出所有应用
pm2 web # 开启api访问
pm2 monit #查看资源消耗