PM2 是一个守护进程管理器,可以用它来管理你的node进程,负责所有正在运行的进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。使用起来也是非常简单。
一 特性
- 日志管理:收集日志,并有插件配合进行管理
- 负载均衡:减轻服务器压力
- 终端监控:可以在终端中监控您的应用程序并检查应用程序运行状况
- 静态服务:支持静态服务器功能
- 集成管理:多个进程,不同环境,统一配置
- SSH部署:自动部署,避免在所有服务器中进行ssh
- 0秒重载:维护升级不需要停机
- 提供HTTP API
二 安装
我们可以通过 NPM 或 Yarn 安装,在安装之前需要安装 Node.js 和 NPM,您可以使用 NVM 来管理Node环境。
npm install pm2@latest -g # or yarn global add pm2
查看pm2的安装路径
whereis pm2
由于系统使用nvm版本管理node,所以前面会有版本号,如果是普通的安装,格式应该为
/usr/local/bin/pm2
再查看下版本号
pm2 -v
出现上图就表示已经安装成功,接下来就可以上手体验了。
三 上手使用
最近由于小程序云开发规则的调整,正好把之前用云开发的项目重构,这里我们用 Nest 项目讲解。关于 Nest 教程,翻看历史记录可以找到。Nest 是基于 Node.js 服务器端应用程序的 WEB 应用框架,可以很轻松的编写 API 接口。
pm2已经安装成功,接下来就是把 Nest 开发的项目部署到服务器上。
首先把整个项目(不是打包后的,至于为什么请看【Nest教程】Nest项目部署在ubuntu服务器)通过 FTP 上传到服务器指定目录,如果你的项目在git库上,可以直接clone到服务器上。
进入项目根目录安装依赖
npm install
如果安装了yarn,可以使用yarn
yarn
a安装完成,直接打包项目
npm run build
生成 dist 文件
如果不放心的话,可以先通过npm run dev 运行下,看项目是是否正常在打包。
1 启动项目
我的项目启动文件是 main.js。用 PM2 启动方式如下
pm2 start main.js
查看项目启动结果
pm2 list
出现上图,并且status为online,则代表启动成功。
2 查看日志
pm2 logs
此时屏幕上会同时输出 error log 和 实时 log , 同时会打印出日志文件的路径。类似:
如果想查询指定日志,用 tail 命令即可。
tail -f /root/.pm2/logs/main-out.log
日志其他操作
# 显示流中的所有进程日志 pm2 logs --raw # 清空所有日志文件 pm2 flush # 重新加载所有日志 pm2 reloadLogs
但是pm2自带的日志功能是不支持自动分割的,这就会导致随之时间的推移,我们的日志文件会越来越大,不但会影响性能,在后期排查问题的时候也会很麻烦,我们可以使用pm2-logrotate插件来解决上面的问题。
安装也是非常简单
pm2 install pm2-logrotate
安装完成后就可以通过pm2 list命令查看模块列表了
通过 pm2 conf pm2-logratate 可以查看详细的配置
pm2 conf pm2-logratate
pm2-logrotate 具体配置说明:
比如我们可以设置日志文件大小为1KB
pm2 set pm2-logratate:max_size 1K
retain是日志文件的最大总数,比如上面的默认值是30,当我们的日志文件超过30个之后,插件会自动将最早的日志文件删除掉,我们就不用花时间再去整理日志文件了,省了我们的不少时间。
切记:修改完不要忘记重启服务,否则不会生效。
pm2 restart all
当大小达到1KB就会自动分割,格式如:main-out__2022-07-29_11-00-32.log 的文件。
pm2日志文件储存在 /root/.pm2/logs 文件夹下。
3 停止项目
我们可以根据项目启动进程的name和id来停止项目。
pm2 stop www # or pm2 stop 0
4 重启项目
用name和id来重启项目
pm2 restart www # or pm2 restart 0
5 删除项目
同样的删除项目也是可以根据name和id来删除的
pm2 delete www # or pm2 delete 0
四 高级用法
有些用法可能不是很常用(对于我来说),但确实是比较好用的功能。
1 重命名
pm2常规启动都是使用默认name,默认name就是你启动的文件名,如果说启动一两个项目,到还很好分辨,如果项目很多,并且都使用默认名字,那就见鬼了,因此,我们可以通过--name来设置
如果项目没有启动,可以通过
pm2 start main.js --name newName
如果已经启动,则可以通过
pm2 restart main.js --name newName
2 监听
在功能升级时,我们需要更新替换文件,然后重启项目,pm2也提供了--watch 功能帮我们完成自动重启
pm2 start main.js --watch
在使用这一参数的时候,有两个需要注意的地方:
- 请在程序所在的目录执行启动命令,否则将会监视的不是程序所在目录,而是你执行目录当前所在的目录。
- 开启 --watch 参数后,就算你手动停止进程(不删除),进程也会在文件发生改变后自动启动,解决该问题的方法是在停止进程的时候加入如下参数:
pm2 stop 0 --watch
这样只要当前目录下有任意文件发生改变,pm2都会尝试重启进程。
3 集群模式
只需要一行,即可实现多线程
pm2 start main.js -i max
适时调整集群数量也是很方便
# 加 pm2 scale main +3 # 改为两个 pm2 scale main 2
4 开机自启
运行 pm2 save,会将当前pm2所运行的应用保存在/root/.pm2/dump.pm2下
运行 pm2 startup,即在/etc/init.d/目录下生成pm2-root的启动脚本,且自动将pm2-root设为服务。
当开机重启时,运行pm2-root服务脚本,并且到/root/.pm2/dump.pm2下读取应用并启动。
5 环境切换
PM2 通过 env 选项声明多个环境配置,规则如下 env 为默认的环境配置(生产环境),env_dev、env_test则分别是开发、测试环境。可以通过process.env.REMOTE_ADDR等来读取配置中的环境变量。
启动指定环境也很简单
6 帮助
通过 -- help 命令可以看到 PM2 支持的子命令还是蛮多的,可以自己查询用法,也可以去官网查看详细文档。