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
用法
- 基本启动命令
pm2 start
// start命令启动对应的node server文件
$ pm2 start ./build/server.js
- 通过配置文件进行启动稍后详细讲解
启动之后,控制台会看到如下消息:
如上图所示,可以看到项目
kafazhe
成功启动,id 是 0,并且状态时 online.
- 查看详细状态信息
pm2 show (appname|id)
$ pm2 show kaifazhe
如上图所示,可以查看到 kaifazhe 进程的详细信息
- 查看所有启动的进程列表
pm2 list
$ pm2 list
- 监控每个 node 进程的 cpu 和内存使用情况
pm2 monit
$ pm2 monit
可以使用 pm2 monit 功能监控所有 node 进程的运行情况,包括各种响应,错误信息。
- 显示所有进程的日志信息
pm2 logs
$ pm2 logs
- 监控运行这些进程的机器的状态
pm2 web
$ pm2 web
我只能说,这也太 NB 了吧,不仅可以监控这些进程,还能监控运行这些进程的机器的状态,逆天了。然后它会自动起一个服务在指定端口,如图在 9615 启动了一个服务,我们可以访问。虽然我看不太懂,但是对于测试运维同学来说,应该挺有用的吧。
- 停止 指定/所有 进程
pm2 stop (id|all)
// 停止id为0的进程
$ pm2 stop 0
// 停止所有进程
$ pm2 stop all
如图,我们运行了两个服务状态都是 online,使用 stop 0 之后,kaifazhe 的服务变成了 stopped,然后使用 stop all,所有进程状态全变成了 stopped。
- 重启 指定/所有 进程
pm2 restart (id|all)
// 重启id为0的进程
$ pm2 restart 0
// 重启所有进程
$ pm2 restart all
- 杀死 指定/所有 进程
pm2 delete (id|all)
// 杀死id为0的进程
$ pm2 delete 0
// 杀死所有进程
$ pm2 delete all
从上图我们可以看出,restart 0 之后,0 进程从 stopped 状态变成了 online,然后我们使用 delete 0,进程 0 就消失不见了,我们再 delete all,可以看到现在没有任何进程在运行。
配置 PM2 启动文件
pm2 启动的方式可以进行很多的扩展,比如设置环境,设置错误信息打印,设置输入信息打印等等高级功能。那么一条命令就不能完成这些任务,所有 pm2 提供了配置文件的方式来启动~
pm2.config.js
// 名称任意,按照个人习惯来
module.exports = {
apps: [
{
name: 'kaifazhe', // 应用名称
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.yoduao.com'
},
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.youdao.com
~
负载均衡
最 666 的功能来了~自动给你做负载均衡,只需要一条命令,以前那些复杂的概念懂不懂无所谓。
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, // 启动两个实例
日志相关
这里是时隔一年后补充的,当初只是为了简单写写总结,不过没想到这么多人点赞喜欢了,那么一年之后随着使用加深,对于pm2有个其他的总结,就补充一下~
pm2日志
上面配置文件可以看出来,我们可以配置logs,包括普通的out和错误的error日志。其实也不需要我们做什么,我们只需要在config里面配置好就行,他就会自动往里面写日志:
很简单的功能,就包含了日志,真是美妙到不行,但是,真的那么美妙吗?哈哈,好像不是?我们的日志全部输出到了err.log
和out.log
内,日积月累,OMG不敢想象,排查问题肯定很费劲,所以就有了下面的日志分割~
日志分割
我们正常意义上的日志,以node为例,应该都是使用的log4js
来进行按日期写入的,那么pm2可不可以按日期写入呢?答案肯定是:可以。
pm2为我们提供了插件系统,而日期分割功能就正好用到了插件系统:pm2-logrotate
安装:
pm2 install pm2-logrotate // 看好了,是pm2 install而不是npm install
你装完之后它就自动启动,然后你还可以配置各种参数
然后就完成了日志按日期分割~
细心的小伙伴可能发现了,你上面让我安装的是
pm2-logrotate
,为啥你安装的是pm2-logrotate-ext
,嗯,因为据说官方的pm2-logrotate
存在一个bug,就是日期会正常分割,但是如果你前一天的文件没有写满比如你设置了1M但只写了500K那么第二天的日志还是会插入到原来的out.log(err.log),所以大牛就写了这个解决了这个问题pm2-logrotate-ext
配合pm2-web实现监控可视化
可能很多人不喜欢控制台,喜欢把监控数据进行可视化更方便查看和分析。不要紧,高手们已经为我们提供了工具,pm2-web,一看就是专门配合pm2来使用的。
安装
npm install -g pm2-web
使用
默认pm2-web会自动启动一个端口8080,但是我们还是喜欢可控状态的,因此按照配置文件的方式启动。
$ pm2-web --config pm2-web-config.json
// pm2-web-config.json
{
"www": {
"host": "localhost",
"address": "0.0.0.0",
"port": 6688
}
}
这样你就可以在浏览器查看可视化的监控状态了~
说明一下,图片是我从网上找的,为什么没在本地启动呢,原因是
pm2-web
依赖node-inspector
,而node-inspector
对于高版本node无法安装,很多人提了issue,但是感觉开发者也处于放弃了的状态。我也不打算在本地安装低版本node,所以感兴趣的大家可以安装个低版本的试试~
谢谢~~~
今天的文章PM2简易使用手册分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20437.html