引言
以前没怎么接触过pm2,因为最近公司项目中遇到pm2日志过大的问题,所以直接解决时系统的了解了下pm2的知识
阅读这篇文章能学会什么?
- node项目如何接入pm2
- 查看pm2的日志管理,了解日志管理规则
- 如何做pm2的日志切割
PM2接入项目
step1. 全局安装pm2
npm i pm2 -g
复制代码
step2. pm2启动node项目
// pm2可以启动js sh py等各种脚本
pm2 start app.js | bashscript.sh | python-app.py | binary-file
复制代码
demo实现node项目接入PM2
// step1. npm init
<!--
packake.json
没用的代码这里去掉了
-->
{
"name": "pm2",
"scripts": {
"start": "pm2 start index.js"
}
}
复制代码
<!--index.js-->
const Koa = require('koa')
const app = new Koa()
app.use(async(ctx, next) => {
ctx.body = 'HELLO PM2!'
await next()
})
app.listen(3000)
复制代码
执行npm start,打开localhost:3000,可以发现服务器运行成功了
强制关闭node进程后,pm2干了啥?
- 启动pm2之初,查看进程,可以发现多了个ID为67065的进程
- ok,关闭67065
- 关闭67065之后发现又多了个67077,然后请求localhost:3000,还是可以HELLO PM2,那么再关闭67077
- 从上图可以看到,关闭67077之后又多了个67105
这说明当进程被退出之后,pm2会自动重开进程,以保证应用的稳定
PM2的命令行
pm2 start <app_name> 启动项目
pm2 list | pm2 ls | pm2 status 查看pm2管理项目列表
pm2 stop <app_name> 停止项目(项目虽然停止了,但是还是会在pm2列表里,可以使用pm2 list查看)
pm2 delete <app_name> 删除项目(删除项目会从列表中删除,pm2 list不再能看到)
pm2 reload <app_name> 重载项目
reload:可以做到0秒宕机来加载新代码,生产环境多用reload来完成代码更新
pm2 restart <app_name> 重启项目
pm2 logs
pm2 logs --lines 5 查看最后5行日志
pm2 flush 清空日志
pm2 monit 查看实时的dashboard 监控每个 node 进程的 cpu 和内存使用情况
pm2 update
类似watch的功能,更新index.js之后,刷新网页没有改变,然后pm2 update,页面更新了
pm2配置:
--watch 可以监视node文件并重启应用 类似nodemon的工具
--ignore-watch="node_modules"
--name 重命名 pm2 start index.js --name app 重命名为app
--log <log_path> 日志地址
--time log with time
--restart-delay 3 单位ms 自动重启时的delay --no-autorestart 不要自动重启服务
pm2修改导出日志地址
<!--pm2.json-->
<!--pm2 init 可以创建一个配置文件-->
{
"name": "app",
"script": "./index.js",
"cwd": "./",
"instances": 1,
"autorestart": true,
"watch": false,
"max_memory_restart": "1G",
"out_file": "pm2-logs/log.log",
"error_file": "pm2-logs/error.log"
}
pm2 start pm2.json
复制代码
会在当前目录下新建一个pm2-logs文件夹,下面有log.log和error.log的日志文件
pm2-logrotate 模块使用
这里介绍下pm2的日志切割模块pm2-logrotate的使用
step 1. 安装pm2-logrotate模块
pm2 install pm2-logrotate
复制代码
step 2. 设置pm2-logrotate的切割规则
1. 设置文件大小为500K,大于等于开始切割
pm2 set pm2-logrotate:max_size 500K
2.设置文件切割的监控间,监控间隔比较大,可能会使切割出的文件大小和max_size有出入
pm2 set pm2-logrotate:workerInterval 1
3. 设置文件最多多少个,超过则删除
pm2 set pm2-logrotate:retain 7
复制代码
pm2-logrotate使用过程中遇到的坑
在使用过程中有一次刚好在设置pm2 set pm2-logrotate:workInterval 1时,服务器的日志文件已经达到设置的10G上线,然后就提示如下错误:
就算是执行pm2 uninstall pm2-logrotate时,也会提示这个Unexpected end of JSON input
当时我的猜测是在写入溢出时设置workInterval,把pm2的文件给搞坏了,但是哪个文件搞坏了没头绪,然后平时因为我电脑只有125G的问题,有个生活教训是当mac提示磁盘不足时如果还在编辑文件,当前文件会被清空
根据这个经验,再去思考当pm2 set pm2-logrotate:workInterval时,应该会去修改pm2的配置文件,那么就去搜索这个配置文件
其实在.pm2的根目录下有个module的配置文件module_conf.json,如下图所示:
检查发现,当前的module_config.json被清空了,所以需要对它重新做下配置
这篇文章介绍了pm2的简单运用,后续再介绍深入的使用