《大前端三问》 node 服务器负载均衡管理器 -- pm2

PM2 是一个带有负载均衡功能的 Node 应用进程管理器。是管理 node 服务器的良好工具。其具有以下主要特性:

  • 内建负载均衡(使用 Node cluster 集群模块)
  • 后台运行
  • 具有 Ubuntu 和 CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口 API(Nodejs 模块,允许和 PM2 进程管理器交互)

官网 ==>

安装
1
2
3
npm install pm2 -g
or
yarn global add pm2

1 常用命令

1.1 启动

启动命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ pm2 start app.js --name my-api # 命名进程
$ pm2 start app.js -i max # 根据有效 CPU 数目启动最大进程数目
$ pm2 start app.js -i 3 # 启动 3 个进程
$ pm2 start app.js -x #用 fork 模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用 fork 模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone # 停止 serverone 进程
$ pm2 start app.json # 启动进程,根据 app.json 里设置选项
$ pm2 start app.js -i max -- -a 23 #在 -- 之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件

# 你也可以执行用其他语言编写的 app (fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python

1.2 进程管理

pm2 进程管理
1
2
3
4
5
6
7
8
9
10
11
12
$ 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](http://localhost:9615/))
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程

基本上进程管理的几个常用维度:
-restart
-reload
-stop
-delete

1.3 主要参数

运行时可加入一些参数控制
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
# Specify an app name(指定进程名)
--name <app_name>

# Watch and Restart app when files change (监控文件改变自动 reload)
--watch

# Set memory threshold for app reload (最大内存,当程序达到规定最大内存时自动 reload)
--max-memory-restart <200MB>

# Specify log file 指定日志文件中午
--log <log_path>

# Pass extra arguments to the script 自定义参数
-- arg1 arg2 arg3

# Delay between automatic restarts 给自动重启设置个延时
--restart-delay <delay in ms>

# Prefix logs with time
--time

# Do not auto restart app
--no-autorestart

# Specify cron for forced restart 定时重启
--cron <cron_pattern>

# Attach to application log
--no-daemon

1.4 基于配置文件启动

我们知道,使用 pm2 启动服务器进程往往要带各种参数,这样在部署时会带来很多麻烦,pm2 支持使用配置文件的方式来启动服务。使用 pm2 init xx 命令可为当前服务初始化配置文件,通常为根目录下的 ecosystem.config.json 文件。

ecosystem.config.json文件
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
{
"apps": [
{
"name": "sys-name",
"script": "dist/main.js",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"out_file": "out/log.txt", // 指定日志
"instances": 1, // app 实例数目
"autorestart": true,
"restart_delay": 10000, // 给重启加个延时,防止过快的失败重启
"watch": [ // 观察这些目录变化 ,自动 reload 服务
"dist",
"static"
],
"ignore_watch": [ // 可忽略一些目录的变化
"node_modules"
],
"max_memory_restart": "1G",
"env": {
"NODE_ENV": "development"
},
"env_fat": {
"NODE_ENV": "fat"
},
"env_uat": {
"NODE_ENV": "uat"
},
"env_production": {
"NODE_ENV": "production"
}
}
]
}

写好配置文件之后,可基于配置文件启动服务了。通常会使用 --env xx 带上环境变量:

使用配置文件启动服务
1
2
pm2 start process.json --env production
pm2 restart process.json --env development

2 特性功能讲解

2.1 秒停机重载

0 秒停机重载命令
1
$ pm2 reload all # 0 秒停机重载进程 (用于 NETWORKED 进程)

这项功能允许你 reload 程序,而不用失去请求连接。

2.2 web仪表盘

启动web仪表盘
1
$ pm2 plus

使用此命令后,会启动一个web可视化仪表盘,访问之可以看到非常炫酷的仪表盘展示系统当前所有信息。

3 引用

  1. pm2 官网