PM2是一个非常强大的命令行工具,可以帮助用户在服务器上运行各种任务,管理系统资源,监控系统性能等。
PM2支持记录系统的各种信息,例如,任务执行情况、进程信息、错误信息等。用户可以在配置文件中设置不同的日志等级,以及记录的时间间隔和方式。
我们一般运行node程序的时候会直接用node执行例如node ./app.js
,但是这样有个不好的点在于程序崩溃时我们需要再次手动启动程序(当然开发环境是无所谓的),而且如果需要负载均衡的话还需要我们在代码层面进行适配。但是这些问题在pm2面前根部就不是问题,pm2可以监控进程,当程序崩溃时自动重启,并且在不侵入代码的情况下进行负载均衡。
说了这么个多pm2的好处,下面就来正式进入学习,第一步首先需要安装工具,最简单的pm2安装方式是使用npm来全局安装(或者可以去官网下载安装)
$ npm install pm2 -g
应用启停
关于应用启停的命令如下
$ pm2 start [<name>|filepath [--name <name>]]
$ pm2 stop <name>
$ pm2 restart <name>
在启动时需要给的参数可以时文件路径,也可以是已经存在的应用名称,关于应用名称可以使用默认命名(文件名),也可以使用主动命名,即通过参数的形式传入。
进程管理
在应用管理方面相关的命令有以下几个
应用列表,列出应用列表的命令有多个,他们实现的功能是完全一致的
$ pm2 ps
$ pm2 l
$ pm2 ls|list
另外还有jlist
命令可以将应用列表输出为json形式
这里我使用了jq工具来提取格式化返回值,原始值非常长就不展示了。
删除应用,删除也是管理所必需的功能,当某个应用过时之后我们需要把它删掉。
$ pm2 delete|del <name>
删除命令执行完成之后还会自动执行以下list命令,用于展示删除应用后的列表状态。
查看详情,列表展示的数据是有限的,当我们需要看完整的应用信息是,需要使用show
命令
$ pm2 show <name>
负载均衡
基于pm2实现负载均衡非常之简单,其底层依赖NodeJS的cluster模块,虽然听起来高大上,但是我们在使用的时候是很简单的。
$ pm2 start ./app.js -i <number>
(启动失败是因为我的脚本是一个http-server,都监听了同一个端口,没有进行适配)
理论上负载均衡的最大值是我们CPU的核心数量,工具也提供了max变量,直接将命令中的集群数量替换为max
即可。
如果想要调整负载均衡的集群数量可以进行如下操作
$ pm2 scale <name> <number>
日志管理
pm2会讲控制台的所有输出全部记录下来,方便我们查看
$ pm2 logs <name|pid>
pm2 logs
会把每一个进程的日志都显示出来,或者也可以指定某个某个应用的日志。
此外pm2还支持插件系统,可以使用插件来进行日志分割,防止一个日志文件过大导致查询不方便的情况。使用命令安装分割插件(注意不是npm install)
pm2 install pm2-logrotate-ext
(如果需要卸载,使用uninstall命令)安装完成之后就会自动运行,如果想看一下module的详情,可以使用命令进行查询
$ pm2 describe pm2-logrotate-ext
性能监控
当需要同时查看多个应用的详情时,以及监控各个应用的性能时,控制台是一个不错的方法,打开控制台的命令有下面两条
$ pm2 dashboard|dash
$ pm2 monit
这控制台中展示了应用的运行消耗资源,运行日志,应用信息等数据,可以方便我们快速的了解应用的状态。
配置文件
可以使用pm2 init
命令来生成一份初始化的配置文件,我们可以基于这个文件进行自定义配置。
常用的配置文件描述如下
// 名称任意,按照个人习惯来
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',
},
],
};
OK,现在你已经掌握了pm2的日常使用技巧,你可能会有疑问,现在流行的k8s方式部署也能轻松实现负载均衡等功能,而且容器化部署可以抹平机器之间的环境差异,为什么还需要pm2呢?
个人看来他们并不是竞品关系,基于k8s的负载均衡是实例的资源扩缩,而pm2的负载均衡是为了CPU资源利用的最大化。