PM2入门
PM2使用背景
对于线上项目,如果直接通过 node app 来启动,如果报错了可能直接停止导致整个服务崩溃,一般监控 node 有几种方案。
supervisor
: 一般用作开发环境的使用。forever
: 管理多个站点,一般每个站点的访问量不大的情况,不需要监控。PM2
: 网站的访问量比较大,需要完整的监控页面。
公司原来的项目采用的是 forever 的形式,不过如果 node 出现问题的时候,没有办法获取到有效的监控数据进行错误排查,因此新开发的系统准备采用 pm2 的形式进行前端以及 node 层的监控。
PM2主要特性
- 内建负载均衡(使用 Node cluster 集群模块)
- 后台运行
- 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
- 具有 Ubuntu 和 CentOS 的启动脚本
- 停止不稳定的进程(避免无限循环)
- 控制台检测
- 提供 HTTP API
- 远程控制和实时的接口 API ( Nodejs 模块,允许和 PM2 进程管理器交互 )
安装
// 全局安装pm2,依赖node和npm
$ npm install -g pm2
用法
(1)基本启动命令:pm2 start
// start命令启动对应的node server文件
$ pm2 start ./build/server.js
npm脚本:
$ npm run pm2
(2)查看详细状态信息:pm2 show (appname|id)
$ pm2 show appblog-cn
(3)查看所有启动的进程列表:pm2 list
$ pm2 list
┌────────────┬────┬─────────┬─────────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├────────────┼────┼─────────┼─────────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ appblog-cn │ 0 │ 1.0.0 │ cluster │ 25288 │ online │ 7 │ 0 │ 0% │ 0 B │ nginx │ disabled │
│ appblog-cn │ 1 │ 1.0.0 │ cluster │ 25299 │ online │ 7 │ 48s │ 0% │ 54.5 MB │ nginx │ disabled │
│ appblog-cn │ 2 │ 1.0.0 │ cluster │ 25317 │ online │ 7 │ 48s │ 0% │ 55.3 MB │ nginx │ disabled │
│ appblog-cn │ 3 │ 1.0.0 │ cluster │ 0 │ stopped │ 7 │ 48s │ 0% │ 54.7 MB │ nginx │ disabled │
└────────────┴────┴─────────┴─────────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘
(4)监控每个 node 进程的 cpu 和内存使用情况:pm2 monit
$ pm2 monit
可以使用 pm2 monit 功能监控所有 node 进程的运行情况,包括各种响应,错误信息。
(5)显示所有进程的日志信息:pm2 logs
$ pm2 logs
(6)监控运行这些进程的机器的状态:pm2 web
$ pm2 web
(7)停止 指定/所有 进程:pm2 stop (id|all)
// 停止id为0的进程
$ pm2 stop 0
// 停止所有进程
$ pm2 stop all
服务状态是 online,使用 stop 之后,服务状态变成 stopped
(8)重启 指定/所有 进程:pm2 restart (id|all)
// 重启id为0的进程
$ pm2 restart 0
// 重启所有进程
$ pm2 restart all
(9)杀死 指定/所有 进程:pm2 delete (id|all)
// 杀死id为0的进程
$ pm2 delete 0
// 杀死所有进程
$ pm2 delete all
服务状态是 online,使用 delete 之后,进程消失
配置 PM2 启动文件
pm2 启动的方式可以进行很多的扩展,比如设置环境,设置错误信息打印,设置输入信息打印等等高级功能。那么一条命令就不能完成这些任务,所以 pm2 提供了配置文件的方式来启动~
pm2.config.js
// 名称任意,按照个人习惯来
module.exports = {
apps: [
{
name: 'appblog', // 应用名称
script: './build/server.js', // 启动文件地址
cwd: './', // 当前工作路径
watch: [
// 监控变化的目录,一旦变化,自动重启
'src',
'build',
],
ignore_watch: [
// 忽视这些目录的变化
'node_modules',
'logs',
'public',
],
node_args: '--harmony', // node的启动模式
env: {
NODE_ENV: 'development', // 设置运行环境,此时process.env.NODE_ENV的值就是development
ORIGIN_ADDR: 'http://www.appblog.cn'
},
env_production: {
NODE_ENV: 'production',
},
out_file: './logs/out.log', // 普通日志路径
error_file: './logs/err.log', // 错误日志路径
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm Z',
},
],
};
对于上面的 env,我们可以在内部添加很多个参数变量,这样我们所使用的 process.env.XXX 就会对应发生变化,例如上面,我们
process.env.ORIGIN_ADDR
的值就是http://www.appblog.cn
负载均衡
自动负载均衡,只需要一条命令,以前那些复杂的概念懂不懂无所谓。
pm2 start server.js -i (number|max)
# 开启三个进程运行项目
pm2 start app.js -i 3
# 根据机器CPU核数,开启对应数目的进程运行项目
pm2 start app.js -i max
配置文件里对应的:"instance": (number|max)
// pm2.config.js
"instances": 2, // 启动两个实例
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/12/pm2-introduction/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论