pm2在项目中的初次尝试

  • Sorzen
  • 10 Minutes
  • April 11, 2019

PM2简介

PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。

为什么使用pm2

平时在本地进行node项目开发时一般直接使用node app.js启动服务,虽然可以用这种方式启动服务,但是这种方式只能应对一些访问量较少的形式,而且如果当node遇到错误导致线程挂掉会造成网站的无法访问,因此需要一种工具帮助node管理繁琐任务,当node进程挂掉时能够帮助机器自动重启、或者当node服务部署在多台机器时可以帮助机器实现负载均衡,因此需要使用pm2来进行node进程管理。

pm2配置文件

项目的运行环境可能会有多个,如线上的生产环境、测试的test环境、开发的dev环境及本地的local环境,使用vue进行项目构建时需要区分不同环境,因此使用pm2进行node进程管理时也需要区分不同的环境,因此pm2需要一个全局的配置文件进行项目的配置。
通过在项目根目录创建pm2.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
34
35
36
37
38
39
40
{
"apps": [
// dev环境配置
{
"name": "YUANNODE-DEV-SERVER",
"cwd": "./dist",
"script": "app.js",
"watch": false,
"ignore_watch": ["node_modules", "build", "logs"],
"log_date_format": "YYYY-MM-DD HH:mm Z",
"out_file": "/data/logs/yuan-node/out.log", // 日志输出
"error_file": "/data/logs/yuan-node/error.log", // 错误日志
"max_memory_restart": "2G", // 超过多大内存自动重启,仅防止内存泄露有意义,需要根据自己的业务设置
"env": {
"NODE_ENV": "dev"
},
"exec_mode": "cluster", // 开启多线程模式(集群),用于负载均衡
"instances": "max", // 启用多少个实例,可用于负载均衡
"autorestart": true // 程序崩溃后自动重启
},
// 生产环境pm2配置
{
"name": "YUANNODE-PROD-SERVER",
"cwd": "./dist",
"script": "app.js",
"watch": false,
"ignore_watch": ["node_modules", "build", "logs"],
"log_date_format": "YYYY-MM-DD HH:mm Z",
"out_file": "/data/logs/yuan-node/out.log", // 日志输出
"error_file": "/data/logs/yuan-node/error.log", // 错误日志
"max_memory_restart": "2G", // 超过多大内存自动重启,仅防止内存泄露有意义,需要根据自己的业务设置
"env": {
"NODE_ENV": "prod"
},
"exec_mode": "cluster", // 开启多线程模式,用于负载均衡
"instances": "max", // 启用多少个实例,可用于负载均衡
"autorestart": true // 程序崩溃后自动重启
}
]
}

通过配置不同环境的env来区分不同环境,为了更好区分环境可以设置不同name,在package.json中根据不同名称来运行不同环境的服务。

1
2
"pm2-dev": "pm2 start pm2.json --only YUANNODE-DEV-SERVER --watch",
"pm2-prod": "pm2 start pm2.json --only YUANNODE-PROD-SERVER --watch",

通过配置pm2可以设置不同环境下log存放的位置,可以配置pm2启动模式,通过设置”exec_mode”: “fork”/“cluster”设置不同的pm2启动模式,pm2默认为fork模式。

“fork”/“cluster”启动模式:

pm2监控

部署到线上的服务一般需要监控系统,可以时刻帮助开发者了解服务运行情况,pm2提供了pm2 Monitoring进行pm2监控,或者使用pm2-web进行监控,如果只是进行常见的服务器异常重启或者过载等监控可以直接使用pm2 monit进行监控,由于不同环境需要监控的服务不同,因此也需要区分监控的命令。

1
2
"pm2-monitor-dev": "pm2 link -- -- YUANNODE-DEV-SERVER",
"pm2-monitor-prod": "pm2 link -- -- YUANNODE-PROD-SERVER"

pm2在nginx上的配置

通过pm2启动node,再使用nginx做反向代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
upstream my_nodejs_upstream {
server 127.0.0.1:3001;
}

server {
listen 80;
server_name my_nodejs_server;
root /home/www/project_root;

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_pass http://my_nodejs_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
}

pm2命令-CLI参考

pm2有很多使用命令,可以通过查看pm2命令