PM2
一、PM2作用
- 进程守护,系统崩溃自动重启
- 启动多线程,充分利用CPU和内存
- 自带日志记录功能
二、 安装
npm install pm2 -g
pm2 --version
三、快速使用
简单的启动一个文件,使用pm2 start命令
例如:
pm2 start index.js
在npm项目中,可以在package.json的script脚本中加入pm2 start命令,
例如:
{
"name": "pm2-test",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "cross-env NODE_ENV=dev nodemon app.js",
"prd": "cross-env NODE_ENV=production pm2 start app.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"cross-env": "^5.2.0",
"nodemon": "^1.18.9"
}
}
然后就会发现,项目跑起来了,且控制台的控制权空置出来了。
四、常用命令
pm2 start <FileName>/<ConfigName> # 可以跟文件,或者配置文件
pm2 list # 可以看到进程列表
pm2 restart <AppName>/<id> # 手动重启
pm2 stop <AppName>/<id> # 停止进程
pm2 delete <AppName>/<id> # 删除进程
pm2 info <AppName>/<id> # 查看基本信息
pm2 log <AppName>/<id> # 日志
pm2 monit <AppName>/<id> # 当前进程cpu、内存信息
五、日志功能
我们直接在代码里面加入console.log或者console.error
然后重启一下pm2进程,并查看log日志
pm2 restart app
pm2 log app
可以看到pm2已经为我们创建了两个日志文件 app-out.log和app-error.log。
此时继续访问服务,控制台会实时打印出新的日志
同理我们可以使用cat命令直接进入这两个文件查看日志。
使用
pm2 monit
也可以进入性能监测的页面,看到日志记录,我们也可以在打开这个页面的时候去访问服务,进行调试。
六、进程守护
为了模拟程序出错,pm2自动重启,我们修改一下测试代码
在里面加入了一个抛错的逻辑,并触发。
明显可以在日志中看到出现了错误信息,但是重新访问正确的url,会发现服务依然正常,这就是pm2出现错误后给我们自动重启。
七、配置
我们可以先看一下当前app这个进程的默认设置,使用pm2 info app命令
在项目目录中加入
pm2.conf.json
{
"apps": {
"name": "pm2-test-server",
"script": "app.js",
"watch": true,
"ignore_watch": [
"node_modules",
"logs"
],
"error_file": "logs/err.log",
"out_file": "logs/out.log",
"log_data_format": "YYYY-MM-DD HH:mm:ss"
}
}
然后修改package.json中的执行脚本,使用pm2 start执行配置文件
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "cross-env NODE_ENV=dev nodemon app.js",
"prd": "cross-env NODE_ENV=production pm2 start pm2.conf.json"
},
停止并删除原来的app进程
pm2 stop app
pm2 delete app
npm run prod启动新的脚本命令
进程名字已经修改了
日志的格式也发生了改变,配置文件已经生效。
八、多进程
多进程启动可以有效利用服务器内存以及多核cpu。只需要在pm2配置文件中加入instance的配置,对应的值是希望开启的线程的个数。
pm2.conf.json
{
"apps": {
"name": "pm2-test-server",
"script": "./app.js",
"watch": true,
"ignore_watch": [
"node_modules",
"logs"
],
"instances": 4,
"error_file": "logs/err.log",
"out_file": "logs/out.log",
"log_date_format": "YYYY-MM-DD HH:mm:ss"
}
}
再次删除之前的进程,重新开启进程,会发现现在一个项目被分到多个进程执行