PM2入门及其常用命令
一、PM2概述
1、简介
进程管理主要是指创建,终止和监控进程。进程管理器主要是用来确保你的应用在启动后能够保持在线
pm2 是 nodejs 的进程管理器,默认支持负载均衡,能够守护进程。还支持查看应用运行时的性能,资源占用情况等
2、普通 node 进程的缺陷
- 普通启动方式:node index.js,关闭终端就结束进程
- node 进程挂掉和“僵死”:
- 进程挂掉大概有以下几种原因:
- 内存泄漏:内存一点点积累到达临界值爆掉
- 死循环导致内存突增爆掉
- 死循环导致磁盘写爆
- 被动被kill,主动退出。
- “僵死”大概有以下几种可能:
- 有某个非常耗时的cpu操作正在执行
- 写了个死循环(死循环不一定会导致服务挂掉,有可能只会cpu飙升,让服务处于假死状态)
- 进程挂掉大概有以下几种原因:
不管发生上面哪种情况,都会造成服务的不可访问,需要等我们自己去发现问题后,然后重启应用。
3、PM2优点
- 后台运行:普通启动方式:node index.js,关闭终端就结束进程;pm2可以后台运行,终端关闭不影响
- 自动重启:在应用意外挂掉或者机器重启后,能够自动重启应用;可以监听某些文件改动,自动重启
- 停止不稳定的进程:限制不稳定的重启的次数,达到上限就停止进程
- 自动负载均衡:支持集群模式,会自动使用轮询的方式达到负载均衡,可以方便的启动多个node进程,充分利用cpu和内存
- 0 秒停机重启:集群模式下,可以达到重启时不停止服务
- 简单日志管理:pm2可以收集日志,并有插件配合进行管理
- 提供实时的接口:pm2插件提供实时的接口,返回服务器与进程的信息
- 可以监控应用性能,资源占用情况等,自动输出日志
- 开发模式支持热更新
- 集成管理:对于多个进程,不同环境,可以统一配置,方便管理
4、PM2安装
1 | # 没有nodejs的需要首先安装 |
二、PM2命令详情
1、PM2常用命令
1.1 启动
1 | # pm2有两种模式,开发模式和生产模式 |
1.2 管理进程
app_name
的位置除了传应用名,还可以传:
all
针对所有进程进行操作id
针对特定id的进程进行操作
集群模式下,restart中断服务,而reload不会
1 | # ------------------------------重启、重载、停止、删除------------------------ |
1.3 应用信息查看
1 | #----------------------------查看运行状态------------------------- |
运行pm2 list
的命令后,可以查看所有 pm2 启动的应用
id
:应用 idname
:应用名称namespace
:在配置文件里面可以给应用设置 namespace。设置后可以使用命令行单独启动或停止某个 namespace 的应用mode
: 进程的运行方式。分为fork
与cluster
pid
:进程iduptime
:运行时间↺
:重启次数(从0开始计数)status
:进程是否在线cpu
:cpu占用率mem
:内存占用大小
而pm2 show app_name|app_id
查看应用详情信息,除了 pm2 list
命令返回的信息以外,还可以获取几个常用信息
script path
:启动入口的文件路径script args
:启动文件的参数error log path
:错误日志的文件路径out log path
:输出日志的文件路径exec mode
:进程的模式watch&reload
:是否开启监听文件变动重启unstable restarts
:不稳定的重启次数
1.4 日志与监控
1 | # 查看指定应用的日志,即标准输出和标准错误; |
2、集成部署EcosystemFile
官方参考:https://pm2.keymetrics.io/docs/usage/application-declaration/
2.1 概述
当我们需要管理多个应用,或者应用有多个运行环境时,使用 pm2 start
来启动应用+配置参数是很不方便的。所以,pm2 支持使用配置文件来启动和管理应用。
1 | # 生成配置文件 |
2.2 配置项详解
基础配置
- name:进程名
- script:node 启动文件的路径
- cwd :项目所在的目录
- args :通过命令行传递给node启动文件的参数
- interpreter :编译器的绝对路径(默认 node )
- interpreter_args :传给编译器的参数
- node_args:传给 node 的参数
进阶配置
- instances :应用启动实例个数,仅在cluster模式有效
- exec_mode :应用程序启动模式。可选
cluster
或fork
,默认为fork
- watch :是否启用监控模式,默认是
false
。如果设置成true
,当应用程序变动时,pm2会自动重载 - ignore_watch :不用监听的文件,如
1 | ignore_watch: [ |
-
max_memory_restart :应用运行内存达到设定值后,会自动重启。避免了
Node.js heap out of memory error
问题 -
env :应用中的默认环境变量
-
env_ :命令行中可传入的环境变量,覆盖默认环境变量
-
source_map_support :默认
true
,支持 sourcemap 文件
日志配置
- log_date_format :日志时间格式
- error_file :错误日志存放路径
- out_file :全部日志存放路径
- combine_logs:是否将不同 id 的进程日志合并
- merge_logs:同上
控制流
- min_uptime:应用被视为已启动最小运行时间
- max_restarts: 在应用状态被认定为
error
前,一定时间(min_uptime
指定的时间,若未配置,则为 1 秒)内的连续不稳定重启次数
1 | # 以上两个配置项一般需要同时设置,以下举个例子 |
- listen_timeout:如果应用没有发送
ready
信号,间隔多长时间 reload。单位为毫秒。 - wait_ready:是否等待进程发送
ready
信号。默认为false
。设置为true
后,需要在应用内部添加process.send('ready')
语句发送ready
信号。
以上两个配置项一般需要搭配使用,详细使用场景见 优雅的启动与停止应用
- kill_timeout:从告诉进程要关闭到强制关闭进程的间隔时间。
1 | module.exports = { |
当 pm2 要停止或重启一个应用时,会按顺序给你的进程发送一系列系统信号。它首先会发送一个 SIGINT
信号告诉你应用将会被停止。然后 pm2 会等待 3s(示例中 kill_timeout
设置的时间)。若 3s 后应用没有自己停止(exit),pm2 会发送一个 SIGKILL
信号来强制停止应用。优雅停止
- estart_delay:进程掉线后,等待多长时间自动重启, 默认 0s
- autorestart: 是否开启自动重启。默认开启。
- cron_restart: 定时重启。可以设置 一天中的固定重启时间, 一周内固定重启日期,或者 一个时间间隔(如 每 48 小时重启一次)。cron_pattern 请参照这里
2.3 使用配置文件
1 | # 启动、停止、重启、重载、删除配置文件中所有项目 |
3、集群模式
3.1 cluster 模式与 fork 模式
- fork 模式 :fork 模式使用最基本的进程运行方式,只是单实例运行server,无法实现 TCP 连接共享。并且我们知道 JavaScript 代码是运行在单线程上的,换句话说一个 Node.js 进程只能运行在一个 CPU 上。那么如果用 Node.js 来做 Web Server,就无法享受到多核运算的好处
- cluster 模式:集群模式允许 nodejs 应用程序在所有可用的 CPU 上进行扩展,而无需修改任何代码。可以显著提高应用程序的性能和可靠性,具体取决于可用的 CPU 数量。在底层,它使用了 Node.js 集群模块,这样扩展后的应用程序的子进程可以自动共享服务器端口。要了解更多信息,请参阅 Node.js 集群
3.2 集群的使用
1 | # 命令行启动 |
**-i
**后面的数字说明
- 0/max :开启进程数量 == cpu核数量
- -1:进程数量 == cpu核数量 - 1
3.3 动态扩展
1 | # 如果希望在运行中动态增加实例数,可以使用下面的命令 |
4、PM2其他进阶
4.1 日志输出
1 | # 只要通过PM2 启动的Node.js项目,可以非常方便的查看其输出日志 |
4.2 监控模式实时更新
1 | # 监控项目目录下所有文件,任意文件有改动,就自动重启 node.js 项目 |
4.3 PM2自启动
1 | # 当服务器意外崩溃重启后,Node.js要能够自启动,恢复服务 |
4.4 环境变量隔离
1 | # 生成配置文件,pm2 init simple |
调用环境变量
env
默认环境变量,只要启动应用:pm2 start ecosystem.config.js
,那么 ip 变量就会被传递给应用 app1env_production
对应调用方式是:pm2 start ecosystem.config.js --env production
env_develop
对应调用方式是:pm2 start ecosystem.config.js --env develop
- 规则是 :配置文件中定义
env_
开头的属性,那么就用--env
参数调用。
--update-env
: 更新环境变量
1 | NODE_ENV=production pm2 restart web-interface --update-env |
4.5 多服务器管理
在 node.js 项目部署发布时,经常用 SSH 分别连接多台服务器,对每一台服务器都要执行 git pull 最新代码,编译启动应用的操作,操作琐碎且容易忘记其中某些操作。pm2 可以很好解决这个问题,只需一个命令就可以自动完成,还能实时监控、查看 node.js 应用的运行情况
第一步:服务器环境配置
- 安装 node.js :不会,看这里!
- 安装 pm2 :
npm install pm2@latest -g
或yarn global add pm2
- 安装 git :不会,看这里
- 配置 SSH,使得服务器可以免密运行
git clone
,不会,看这里!
第二步:开发机器环境配置
1 | // node.js 项目操作步骤配置,注意修改对应的信息 |
最后执行命令
1 | # pm2 连接服务器,通知其 git clone 代码等初始化工作 |
下面说一下命令详解
1 | # 命令格式 |
4.6 PM2 开启文件服务
1 | # --------------------------------1--------------------------- |
5、Docker 集成
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启,这是另一种监控后台的方式,详情可以参考:Supervisor+Dockerfile编译jdk镜像
1 | #在容器中安装 pm2 |
**注意:在容器中使用 pm2 启动应用时,要使用 pm2-runtime
而不是 pm2 start
, 因为:**pm2 是默认后台启动的, docker 感知不到。CMD 命令执行完成,docker 容器就结束了。 所以直接使用 node app.js
启动应用后,应用能一直在容器中保持运行。 pm2 以后台形式运行,CMD 命令执行完成,docker 就认为可以退出了。所以需要使用 pm2-runtime
来进行处理。pm2-runtime
是为 Docker 容器设计的,它将应用程序置于前台,从而使容器保持运行状态
https://pm2.keymetrics.io/docs/usage/quick-start/
https://www.jianshu.com/p/02af8c5261e5