小艾的自留地

Stay foolish, Stay hungry

PM2 是Node.js 生产环境中的进程管理工具,自带负载均衡功能。

安装

1
$ npm install pm2 -g

无缝更新

1
$ pm2 update

启动应用

PM2 中有好几种方式启动应用,一种是直接调用应用入口文件,一种是通过调用配置文件启动应用,还可以在 PM2 上使用 NPM 运行服务

在PM2上使用 NPM 运行服务

1
$ pm2 start npm --name "app" -- start

在 pm2 上使用 npm 运行服务,-- 参数后面的 start 是额外需要传递的参数,注意,中间是有一个空格的。

命令行启动

在生产环境中,通过命令行启动服务

1
$ pm2 stat app.js

配置文件启动

很多时候,仅仅只是使用 PM2 去启动应用,可能不能完全满足我们的需求。

当需要对应用有更多的要求时,这个时候就需要用到PM2 的配置文件了。

PM2 支持通过配置文件创建管理应用,首先在项目根目录手动创建配置文件precesses.json

1
2
3
4
5
6
7
8
9
10
{
"apps": [
{
"name": "myApp",
"cwd": "/var/www/app/",
"script": "./app.js",
"watch": true
}
]
}

或者直接使用 pm2 init 命令,自动创建默认的ecosystem.config.js配置文件:

1
2
3
4
5
6
7
module.exports = {
apps : [{
name: "myApp",
script: 'index.js',
watch: '.'
}
};

这两种方式都可以创建管理应用,作用都是一样的,区别只是:一个是json格式的配置文件,一个是js格式的配置文件。

上面是一个最简单的processes.json配置,创建了一个myApp应用,如果你有多个服务,那么apps 这个数组中创建多个应用。

创建好配置文件之后,那么该如何启动呢?

有两种方式:

  1. 直接调用配置文件启动
1
$ pm2 start processes.json

可以增加--env参数,来指定当前启动环境。

  1. 通过package.json 配置文件,配置脚本启动
1
2
3
4
5
6
// package.json

"scripts": {
"start": "node server/index",
"pm2": "pm2 start processes.json"
}

然后就可以直接使用npm start pm2 来启动应用了。

参数说明

在配置文件你可以指定环境变量、日志文件、进程文件,重启最大次数…等配置项。支持JSON和YAML格式。

PM2 的配置支持非常多的参数,下面会对常用的参数一一做说明。

字段 类型 描述
name string myApp 应用的名字,默认是脚本文件名
cwd string /var/www/myApp 应用程序所在目录
script string ./server.js 应用程序的脚本路径,相对于应用程序所在目录
log_date_format string YYYY-MM-DD HH:mm Z 日志时间格式
error_file string - 错误日志存放路径
out_file string - 输出日志存放路径
pid_file string - pid文件路径
watch boolean or array true 当目录文件或子目录文件有变化时自动重新加载应用
ignore_watch list [”[/]./”, “node_modules”] list中的正则匹配的文件和目录有变化时不重新加载应用
max_memory_restart string 50M 当应用超过设定的内存大小就自动重启
min_uptime string 60s 最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
max_restarts number 10 设置应用程序异常退出重启的次数,默认15次(从0开始计数)
instances number 1 启动实例个数
cron_restart string 1 0 * * * 定时重启
exec_interpreter string node 应用程序的脚本类型,默认是node
exec_mode string fork 应用启动模式,支持fork和cluster模式,默认为fork
autorestart boolean true 应用程序崩溃或退出时自动重启

有以下几点需要注意 ⚠️:

  1. 如果processes.json或者ecosystem.config.js 配置文件如果发生了变化,建议直接删除应用之后,重新创建,否则可能部分配置不会生效。
  2. cwd 不要填绝对路径,建议用相对路径,./表示相对于配置文件根目录,否则可能会出现静态资源丢失的情况。

进程监控

列出所有节点应用程序(进程/微服务)

1
2
$ pm2 list
$ pm2 ls

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

1
2
$ pm2 jlist
$ pm2 prettylist

使用进程ID或名称查看所示的单个Node进程的详细信息:

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

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

1
$ pm2 monit

日志管理

查看某个应用的日志:

1
$ pm2 logs ['all' | app_name | app_id ]
1
2
3
4
$ pm2 logs --json         # JSON 格式输出
$ pm2 logs --format # 格式化 output
$ pm2 flush # 清空所有日志文件
$ pm2 reloadLogs # 重新加载所有日志文件

常用命令

停止进程

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

重启进程

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

0秒停机重载进程 (用于 NETWORKED 进程)

1
$ pm2 reload all

杀死进程

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

使用PM2 运行 npm start

npm run xxxx 是 node常用的启动方式之一,那么如何使用PM2来实现对该方式的启动呢?

npm runnpm start等命令之所以可以使用,是因为package.json配置文件中增加了对应的脚本命令。

1
2
3
4
"scripts": {
"start-dev": "env $(cat .env | xargs) nodemon server/index",
"start": "node server/index",
}

语法:

1
pm2 start npm --watch --name <taskname> -- run <scriptname>;

其中 --watch监听代码变化,--name重命名任务名称,-- run后面跟脚本名字

实例:

1
2
// 等效于 npm start
pm2 start npm --watch --name webserver -- run start

稳定运行

PM2 是一款非常优秀的 Node 进程管理工具,它有着丰富的特性,能够充分利用多核CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启。

为了保证能够稳定运行,可以参考以下几点建议:

  1. 应用进程运行时间久了或许总会产生一些意料之外的问题,定时重启可以规避一些不可测的情况;
  2. 最大内存限制,根据观察设定合理内存限制,保证应用异常运行;
  3. min_uptimemin_uptime 是应用正常启动的最小持续运行时长,合理设置设置此范围,可以将超出时间判定为异常启动;
  4. 设定异常重启延时restart_delay,对于异常情况导致应用停止,设定异常重启延迟可防止应用在不可测情况下不断重启的导致重启次数过多等问题;
  5. 设置异常重启次数,如果应用不断异常重启,并超过一定的限制次数,说明此时的环境长时间处于不可控状态,服务器异常。此时便可停止尝试,发出错误警告通知等。

参考链接

评论