PM2入门

PM2使用背景

对于线上项目,如果直接通过 node app 来启动,如果报错了可能直接停止导致整个服务崩溃,一般监控 node 有几种方案。

  • supervisor: 一般用作开发环境的使用。
  • forever: 管理多个站点,一般每个站点的访问量不大的情况,不需要监控。
  • PM2: 网站的访问量比较大,需要完整的监控页面。

公司原来的项目采用的是 forever 的形式,不过如果 node 出现问题的时候,没有办法获取到有效的监控数据进行错误排查,因此新开发的系统准备采用 pm2 的形式进行前端以及 node 层的监控。

PM2主要特性

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口 API ( Nodejs 模块,允许和 PM2 进程管理器交互 )

安装

1
2
// 全局安装pm2,依赖node和npm
$ npm install -g pm2

用法

(1)基本启动命令:pm2 start

1
2
// start命令启动对应的node server文件
$ pm2 start ./build/server.js

npm脚本:

1
$ npm run pm2

(2)查看详细状态信息:pm2 show (appname|id)

1
$ pm2 show appblog-cn

(3)查看所有启动的进程列表:pm2 list

1
2
3
4
5
6
7
8
9
10
$ pm2 list

┌────────────┬────┬─────────┬─────────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├────────────┼────┼─────────┼─────────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ appblog-cn │ 0 │ 1.0.0 │ cluster │ 25288 │ online │ 7 │ 0 │ 0% │ 0 B │ nginx │ disabled │
│ appblog-cn │ 1 │ 1.0.0 │ cluster │ 25299 │ online │ 7 │ 48s │ 0% │ 54.5 MB │ nginx │ disabled │
│ appblog-cn │ 2 │ 1.0.0 │ cluster │ 25317 │ online │ 7 │ 48s │ 0% │ 55.3 MB │ nginx │ disabled │
│ appblog-cn │ 3 │ 1.0.0 │ cluster │ 0 │ stopped │ 7 │ 48s │ 0% │ 54.7 MB │ nginx │ disabled │
└────────────┴────┴─────────┴─────────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘

(4)监控每个 node 进程的 cpu 和内存使用情况:pm2 monit

1
$ pm2 monit

可以使用 pm2 monit 功能监控所有 node 进程的运行情况,包括各种响应,错误信息。

(5)显示所有进程的日志信息:pm2 logs

1
$ pm2 logs

(6)监控运行这些进程的机器的状态:pm2 web

1
$ pm2 web

(7)停止 指定/所有 进程:pm2 stop (id|all)

1
2
3
4
// 停止id为0的进程
$ pm2 stop 0
// 停止所有进程
$ pm2 stop all

服务状态是 online,使用 stop 之后,服务状态变成 stopped

(8)重启 指定/所有 进程:pm2 restart (id|all)

1
2
3
4
// 重启id为0的进程
$ pm2 restart 0
// 重启所有进程
$ pm2 restart all

(9)杀死 指定/所有 进程:pm2 delete (id|all)

1
2
3
4
// 杀死id为0的进程
$ pm2 delete 0
// 杀死所有进程
$ pm2 delete all

服务状态是 online,使用 delete 之后,进程消失

配置 PM2 启动文件

pm2 启动的方式可以进行很多的扩展,比如设置环境,设置错误信息打印,设置输入信息打印等等高级功能。那么一条命令就不能完成这些任务,所以 pm2 提供了配置文件的方式来启动~

pm2.config.js

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
// 名称任意,按照个人习惯来
module.exports = {
apps: [
{
name: 'appblog', // 应用名称
script: './build/server.js', // 启动文件地址
cwd: './', // 当前工作路径
watch: [
// 监控变化的目录,一旦变化,自动重启
'src',
'build',
],
ignore_watch: [
// 忽视这些目录的变化
'node_modules',
'logs',
'public',
],
node_args: '--harmony', // node的启动模式
env: {
NODE_ENV: 'development', // 设置运行环境,此时process.env.NODE_ENV的值就是development
ORIGIN_ADDR: 'http://www.appblog.cn'
},
env_production: {
NODE_ENV: 'production',
},
out_file: './logs/out.log', // 普通日志路径
error_file: './logs/err.log', // 错误日志路径
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z',
},
],
};

对于上面的 env,我们可以在内部添加很多个参数变量,这样我们所使用的 process.env.XXX 就会对应发生变化,例如上面,我们process.env.ORIGIN_ADDR的值就是http://www.appblog.cn

负载均衡

自动负载均衡,只需要一条命令,以前那些复杂的概念懂不懂无所谓。

1
pm2 start server.js -i (number|max)
1
2
3
4
# 开启三个进程运行项目
pm2 start app.js -i 3
# 根据机器CPU核数,开启对应数目的进程运行项目
pm2 start app.js -i max

配置文件里对应的:"instance": (number|max)

1
2
// pm2.config.js
"instances": 2, // 启动两个实例

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :