pm2:带负载均衡功能的Node应用进程管理工具

pm2 介绍

pm2是nodejs应用程序的进程管理工具,内置负载均衡。其可以帮助您保持node应用程序的永久活动,无需停机皆可重新加载node应用程序。

pm2的主要特性

  1. 内建负载均衡(使用了Node cluster 集群模块)
  2. 后台运行
  3. 0秒停机重载(我的理解: 在维护升级node应用程序时不需要停机)
  4. 停止不稳定的进程(避免无限循环)
  5. 提供 HTTP API
  6. 远程控制和实时接口API(Nodejs模块,允许和pm2交互)
  7. 控制台检测

安装(全局)

npm install -g pm2

常用命令一览

## 普通 ##
npm install -g pm2  # 安装pm2
pm2 start app.js  # 启动&守护进程,自动重启Node应用程序
pm2 start app.py  # 启动&守护进程,自动重启python应用程序
pm2 start script.sh  # 启动&守护进程,自动重启bash脚本
pm2 start app.json  # 启动&守护app.json中声明的所有应用


## 集群模式(只支持node进程) ##
pm2 start app.js -i 4  # 启动4个应用程序实例,并将网络请求负载均衡到每个应用中。
pm2 start app.js -i max  # 根据有效cpu数启动最大的进程数
pm2 start app.js -x  # 用fork模式启动而非cluster
pm2 start app.js -e err.log -o out.log  # 启动应用程序并分别指定标准输出日志文件和错误日志文件
pm2 reload all  # 0秒重启所有应用
pm2 scale [app-name] 10  # 将应用程序调整到10个实例


## 进程监控 ##
pm2 list  # 列出所有由pm2启动的进程
pm2 monit  # 显示每个应用占用的cpu和内存
pm2 show [app-name]  # 显示某个进程的所有信息


## 日志管理  ##
pm2 logs  # 显示所有应用的日志
pm2 logs [app-name]  # 显示某个应用的日志
pm2 logs --json  # json化日志
pm2 flush  # 清除日志
pm2 reloadLogs   #重载日志


## 进程状态管理 ##
pm2 start app.js --name="api"  # 启动应用并命名为api
pm2 start app.js -- -a 34  # 启动应用,并传递参数“-a 34”(在--之后给app.js传递参数)
pm2 start app.js --watch  # 启动应用,并设置当文件改变时会重启应用
pm2 start app.py  # 启动&守护进程,自动重启python应用程序
pm2 start script.sh  # 启动&守护进程,自动重启bash脚本
pm2 start app.json  # 启动&守护app.json中声明的所有应用
pm2 reset [app-name]  # 重置应用的重启数量
pm2 stop all  # 停止所有应用
pm2 stop 0  # 停止id为0的应用
pm2 restart all  # 重启所有应用
pm2 gracefulReload all  # 在集群模式下,平稳的重新加载所有应用
pm2 delete all  # 杀掉所有应用
pm2 delete 0  # 杀掉id为0的进程


## 重启/引导管理  ##
pm2 startup  # 自动检测init系统 + 在服务器启动时生成和配置pm2引导
pm2 startup [platform]  # 手动指定启动系统,可以是:systemd、upstart、launchd、rcd。
pm2 unstartup  # 在服务器启动时禁用和删除pm2引导
pm2 save  # 保存当前进程列表
pm2 resurrect  # 恢复以前保存的进程
pm2 unstartup  # 停用和删除启动系统
pm2 update  # 保存进程,终止pm2并恢复进程
pm2 generate  # 生成样本json配置文件


## 部署 ##
pm2 deploy app.json prod setup  # 设置“生产环境”远程服务器
pm2 deploy app.json prod  # 更新“生产环境”远程服务器
pm2 deploy app.json prod revert  # 将“生产环境”远程服务器恢复


## 模块系统 ##
pm2 module:generate [name]  # 生成名为name的示例模块
pm2 install pm2-logrotate  # 安装模块(这里是日志循环模块)
pm2 uninstall pm2-logrotate  # 卸载模块(这里是日志循环模块)
pm2 publish  # 增量邦本,git push和npm发布

命令详解

## 进程管理 ##
pm2 list  # 列出所有正在运行的由pm2启动的应用程序
pm2 stop <app-name| id | “all” | json-conf>  # 停止应用程序(某名称| 某id| 所有| json文件内声明的应用)
pm2 restart <app-name| id | “all” | json-conf>   # 重启应用程序
pm2 delete <app-name| id | “all” | json-conf> # 杀掉进行(应用程序)
pm2 describe <id | app-name>  # 列出应用程序(某id| 某名称)更详细的信息

##  日志 ##
# 实时显示指定进程or所有进程的日志,并提供标准、原始、JSON和格式化输出
pm2 logs [ "all" | app-name | app-id ]  [--json]  [--format]  [--raw]


特别说明

1. 生成启动脚本

pm2可以生成和配置启动脚本,以方便在每次服务器重启时保持pm2和您进程的活动。
支持init系统,如下:

  • systemd(Ubuntu 16 , CentOS, Arch)
  • upstart( Ubuntu 14/12)
  • launchd( MacOSx, Darwin)
  • rcd( FreeBSD)

2. 模块系统

pm2嵌入了一个简单而强大的模块系统,安装模块很简单

pm2 install <module-name>

下面是一些pm2兼容模块:

  • pm2-logrotate # 自动轮换pm2的日志和管理的应用程序
  • pm2-webshell # 在浏览器中展示一个功能完备的终端
  • pm2-server-monit # 监控您的服务器运行状态

配置pm2启动文件(~~~~推荐重点关注)

可以通过配置一个pm2启动文件,统一管理多个应用程序。

PS:
若想使用pm2启动监控python进程,推荐通过sh脚本文件来启动python文件

# xxx.sh文件内容 #
python   ./web_service.py

##  processes.json  ##

{
 "apps": [
 {
  "name": "my-app1",
  "cwd": "/srv/node-app/current",
  "script": "bin/xxx",
  "log_date_format": "YYYY-MM-DD HH:mm:ss",
  "error_file": "/var/log/node-app/node-app.stderr.log",
  "out_file": "log/node-app.stdout.log",
  "pid_file": "pids/node-geo-api.pid",
  "instances": 6,
  "min_uptime": "200s",
  "max_restarts": 10,
  "max_memory_restart": "1M",
  "cron_restart": "1 0 * * *",
  "watch": false,
  "merge_logs": true,
  "exec_interpreter": "node",
  "exec_mode": "fork",
  "autorestart": false,
  "vizion": false
 },
{
  "name": "maoqiang-runner",
  "cwd": "D:\\Projects\\ONU\\projects\\TelecomTest",
  "script": "web_service.sh",
  "log_date_format": "YYYY-MM-DD HH:mm:ss",
  "error_file": "D:\\pm2\\logs\\maoqiang-runner.stderr.log",
  "out_file": "D:\\pm2\\logs\\maoqiang-runner.stdout.log",
  "pid_file": "D:\\pm2\\logs\\maoqiang-runner.pid",
  "env": {
     PYTHONIOENCODING:'utf-8'
  },
  "instances": 1,
  "min_uptime": "60s",
  "max_restarts": 10,
  "max_memory_restart": "1M",
  "watch": true,
  "exec_interpreter": "bash",
  "exec_mode": "fork",
  "autorestart": true,
  "vizion": true
 }
 ]
}

processes.json说明:

  • apps: json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
  • name:应用程序名称
  • cwd:应用程序所在的目录
  • script:应用程序的脚本路径
  • log_date_format: 指定日志日期格式
  • error_file:自定义应用程序的错误日志文件
  • out_file:自定义应用程序日志文件
  • pid_file:自定义应用程序的pid文件
  • env: objects对象,可设置pm2的编码格式等
    • PYTHONIOENCODING:字符串,编码,如: "utf-8"
  • instances: 实例(进程)个数
  • min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
  • max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数)
  • max_memory_restart : 最大内存限制,超出内存限制会自动重启
  • cron_restart:定时启动,解决重启能解决的问题
  • watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。
  • merge_logs: 合并日志
  • exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
  • exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
  • autorestart:启用/禁用应用程序崩溃或退出时自动重启
  • vizion:启用/禁用vizion特性(版本控制)

配置好processes.json后,可以通过以下命令行启动应用:

pm2 start processes.json

pm2设置开机自启动

Linux

  1. 运行 pm2 startup,检测init系统,并生成启动脚本(若有提示需要执行命令,请直接照搬执行。)

  2. 运行 pm2 save,会将当前pm2所运行的应用保存在/[用户路径]/root/.pm2/dump.pm2下,当开机重启时,运行pm2自启动服务脚本,并且到/root/.pm2/dump.pm2下读取应用并启动。

Window

  1. 安装并配置 pm2-windows-service
    pm2-windows-service可以将 pm2 安装成 windows service, 达到开机运行的目的。
npm i -g pm2-windows-service

PS:
将pm2安装为 windows service,会导致只能以管理员身份运行pm2命令,普通用户运行pm2命令会报如下错误:


图片.png
  1. 添加pm2环境变量
    添加系统环境变量 PM2_HOME=D:\.pm2
    右键 [我的电脑] - [属性] - [高级系统设置] - [环境变量] - 新建 [系统变量]
    名称PM2_HOME
    路径D:.pm2(.pm2路径一般为:c:\Users<username>.pm2,具体以实际情况为准)

  2. 安装服务

# 以管理员权限打开新的命令行窗口,执行以下命令来安装服务
pm2-service-install

# 拓展:卸载服务
pm2-service-uninstall

Perform environment setup ? 选 n, 继续
此时, PM2服务已安装成功并已启动, 可以通过 Wn+R来查看,输入services.msc即可看到服务


图片.png
  1. 添加到自启动服务
    pm2 save很重要, 它保存当前pm2 正在管理的NodeJS服务, 并在开机后恢复这些服务。
pm2 save

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容