使用 pm2 进程管理工具来管理 nodejs 进程
对于后台进程的管理,常用的工具是 crontab,可用于两种场景:定时任务和常驻脚本。关于常驻脚本,今天介绍一款更好用的工具:pm2,基于 nodejs 开发的进程管理器,适用于后台常驻脚本管理,同时对 node 网络应用有自建负载均衡功能。
官方的说法,pm2 是一个带有负载均衡功能的 Node 应用的进程管理器,个人认为,并不准确,因为 pm2 支持多种语言,只是对于除 node 之外的其他进程无负载均衡的能力。
以下部分内容摘录于知乎
知乎地址
pm2 特点:
说一些 pm2 有哪些优点好处呢?
01. 支持进程行为配置 ,即可以通过配置,实现对 pm2 管理应用的一些基础属性更新修改,如应用名称,启动模式等;
02. 支持集群模式,支持负载均衡,但因采用 nodejs 的 cluster 模块实现,仅适用于 nodejs 进程;
03. 支持 source map,此项针对 js, source map 文件是 js 源文件的信息文件,里面存储着源文件的位置信息;
04. 支持热重启;
05. 支持部署工作流,pm2 可依据测试环境和线上环境自动部署到不同的服务器,同时运行在不同配置下;
06. 支持监听重启,在文件更新等情况下可实现进程自动重启;
07. 支持 linux 的 startup 进程启动,startup 是指系统 boot, 进程自启动,如 centos 的 chkconfig;
08. 日志管理,两种日志,pm2 系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中;
09. 命令自动补全功能,个人感觉这个功能意义不大,而且尝试了一下,没有原生的 linux 命令自动补全反应敏捷;
10. 监控功能,pm2 monit 监控 cpu 和 memory 使用情况,keymetrics 监控更为详细;
11. 支持开发调试模式,非后台运行,pm2-dev start
;
12. 支持 pm2 模块开发,实现 pm2 的功能扩展;
13. keymetrics 监控,比 pm2 monit 监控更为详细友好,通过 web 页面展示;
14. 最大内存重启,设置最大内存限制,超过限制自动重启;
15. 编程 API,提供 API 供开发者通过编程方式灵活管理进程;
以上简要概述了 pm2 进程管理工具的特点。
pm2 常用命令
常用命令通常都是比较简单。下面列举一些 pm2 常用的管理命令
pm2 start [options]
启动指定应用,如 pm2 start index.js --name httpServer
pm2 stop [options]
停止指定应用,如 pm2 stop httpServer
pm2 reload|restart [options]
重启指定应用,如 pm2 restart httpServer
pm2 show [options]
显示指定应用详情,如 pm2 show httpServer
pm2 delete [options]
删除指定应用,如 pm2 delete httpServer
,如果修改应用配置行为,最好先删除应用后,重新启动方才生效,如修改脚本入口文件;
pm2 kill
杀掉 pm2 管理的所有进程;
pm2 logs
查看指定应用的日志,即标准输出和标准错误;
pm2 monit
监控各个应用进程 cpu 和 memory 使用情况;
pm2 常用配置
pm2 配置方式
命令行方式
pm2 start index.js --name HttpServer --interpreter node
此处通过命令的选项配置应用名称为 httpServer,index.js 脚本文件解释器为 node,更多选项可查看 pm2 –help 获取;
配置文件方式
pm2 配置文件方式支持 yml 与 json 格式
processes.yml 文件
apps: - script:./api.js name:'api-app' instances:4 exec_mode:cluster - script:./worker.js name:'worker' watch:true env: NODE_ENV:development env_production: NODE_ENV:production
processes.json
{ apps:[ { name:'worker', script:'./worker.js', watch:true, env:{ "NODE_ENV":"development" }, env_production:{ "NODE_ENV":"production" } }, { name:"api-app", script:"./api.js", instances:4, exec_mode:"cluster" }, ... ] }
配置项如下:
配置项 | 说明 |
---|---|
name | 应用进程名称 |
script | 启动脚本路径 |
cwd | 应用启动的路径 |
args | 传递给脚本的参数 |
interpreter | 指定的脚本解释器 |
interpreter_args | 传递给解释器的参数 |
instances | 应用启动实例个数,仅在 cluster 模式有效,默认为 fork; |
exec_mode | 应用启动模式,支持 fork 和 cluster 模式 |
watch | 监听重启,启用情况下,文件夹或子文件夹下变化应用自动重启 |
ignore_watch | 忽略监听的文件夹,支持正则表达式 |
max_memory_restart | 最大内存限制数,超出自动重启 |
env | 环境变量,object 类型,如{“NODE_ENV”:”production”, “ID”: “42”}; |
log_date_format | 指定日志日期格式,如 YYYY-MM-DD HH:mm:ss; |
error_file | 记录标准错误流,$HOME/.pm2/logs/XXXerr.log),代码错误可在此文件查找 |
out_file | 记录标准输出流,$HOME/.pm2/logs/XXXout.log),如应用打印大量的标准输出,会导致 pm2 日志过大 |
min_uptime | 应用运行少于时间被认为是异常启动 |
max_restarts | 最大异常重启次数,即小于 min_uptime 运行时间重启次数 |
autorestart | 默认为 true, 发生异常的情况下自动重启 |
cron_restart | crontab 时间格式重启应用,目前只支持 cluster 模式 |
force | 默认 false,如果 true,可以重复启动一个脚本。pm2 不建议这么做 |
restart_delay | 异常重启情况下,延时重启时间 |
fork 与 cluster 启动模式
pm2 启动进程支持 2 种方式:fork 与 cluster,关于它们的区别,个人认为就是 node api 的 child_process.fork 与 cluster 的区别.
fork 不可以启动多个实例进程,cluster 可以启动多个实例进程.
fork 模式可以应用于其他语言,如 php,java,perl,bash 等,而 cluster 只能应用于 node.
fork 不支持定时重启,cluster 支持定时重启.
定时重启也就是配置中的 cron_restart 配置项.
pm2 的监控
pm2 的监控有 2 种方式:
cli 方式监控
pm2 monit
是专门用来监控的命令,监控项包括 cpu 与内存.
缺点 monit 展示内容太过粗糙,不够详细.
pm2 list 展示当前所有 pm2 的管理项目
可以查看出每个进程的运行状态。
如果需要更详细的监控内容,对于 cli 而言一般都是可以实现的。
这种监控方式的缺点:
a. 不够直观,需要自己去执行命令并分析结果;
b. 不便于多台服务器的应用监控管理;
由于这些缺点,就需要一种更好的方式去监控我们的应用
keymetrics 监控
keymetrics 监控是 PM2 的开发者的开发和维护的一款监控工具,安装配置非常容易.
keymetrics 监控平台日志
日志系统对于任意应用而言,通常都是必不可少的一个辅助功能。pm2 的相关文件默认存放于$HOME/.pm2/
目录下,其日志主要有两类:
$HOME/.pm2/pm2.log
;$HOME/.pm2/logs/
目录下标准输出日志存放于
${APP_NAME}_out.log
标准错误日志存放于
${APP_NAME}_error.log
;稳定运行建议
pm2 日常应用(以 linux 为例)
1.安装 pm2
npm install -g pm2
2.在 linux 服务器上开启 pm2 开机启动(重要)
执行该命令之后会在当前登录用户下设置 systemd 启动脚本,并自动执行 systemctl enable pm2-{user}
pm2 startup systemd
设置过 pm2 开机启动之后则 pm2 可以通过 systemd 进行控制
3.保存 pm2 设置
pm2 save
以下是 pm2 的官方文档,比较详细,推荐阅读!
pm2 详细文档