1、pm2是什么?
pm2, 全称是process manager 2,是一个进程管理工具,维护一个进程列表,可以用它来管理node进程
。
官网地址:pm2.keymetrics.io/
node应用需要用 pm2 的日志管理、进程管理、负载均衡、性能监控等功能。
分别对应 pm2 logs、pm2 start/restart/stop/delete、pm2 start -i、pm2 monit等命令。
2、pm2可做什么事情?
- 监听文件变化,自动重启程序
- 支持性能监控
- 负载均衡
- 程序崩溃自动重启
- 服务器重新启动时自动重新启动
- 自动化部署项目
3、pm2安装
3.1 全局安装
ruby
$ npm install pm2@latest -g
# or
$ yarn global add pm2
3.2 查看版本
ruby
$ pm2 -v
4、pm2 基础命令使用
1. 启动
(1)启动应用程序
ruby
$ pm2 start app.js
- 您还可以启动任何类型的应用程序,如 bash 命令、脚本、二进制文件:
ruby
$ pm2 start "npm run start"
$ pm2 start "ls -la"
$ pm2 start app.py
(2)启动并显示日志流
- 要启动应用程序并显示日志流,使用
--attach
选项 - 通过 Ctrl-C 退出时,该应用程序仍将在后台运行。
sql
$ pm2 start app.js --attach
(3)传递参数
--
之后传递的所有选项都将作为参数传递给应用程序
sql
$ pm2 start app.js -- arg1 arg2
(4)配置文件
- 当同时管理多个应用程序或必须指定多个选项时,可以使用配置文件。
执行 pm2 ecosystem,会创建一个配置文件:
apps 部分就是配置应用的,scripts 就是应用的启动路径:
- 然后可以通过配置文件同时启动两个应用程序:
arduino
$ pm2 start ecosystem.config.js
2、restart
ruby
$ pm2 restart app_name # 重启应用
$ pm2 restart all # 重启所有应用
$ pm2 restart app1 app3 app4 # 重启多个应用
3、停止
- stop 停止应用
ruby
$ pm2 stop app_name # 停止应用
$ pm2 stop [process_id] # 停止应用
$ pm2 stop all # 停止所有应用
$ pm2 stop app1 app3 app4 # 停止多个应用
4、删除
- delete停止和删除应用
perl
$ pm2 delete app_name # 停止和删除应用
$ pm2 delete all # 停止和删除所有应用
5、列表
- 列出所有应用
shell
$ pm2 list
# Or
$ pm2 [list|ls|l|status]
- 指定您希望应用程序列出的顺序
shell
$ pm2 list --sort name:desc
# Or
$ pm2 list --sort [name|id|pid|memory|cpu|status|uptime][:asc|desc]
6、资源仪表板
-
PM2 为您提供了一种监视应用程序资源使用情况的简单方法。
-
Ctrl+C可以退出。
pm2 monit
7、显示应用详情
ruby
$ pm2 show app_name
8、重置重启计数
css
$ pm2 reset all
9、集群模式启动(可作为负载均衡)
arduino
// -i 表示 number-instances 实例数量
// 指定max或者0,表示PM2将自动检测可用CPU的核数量(如下,使用的cpu为8核),当然可以自己指定数量
pm2 start start.js -i max
5、Dockerfile中使用pm2 去代替node
如下Nest为例: 之前我们写的 Nest 的 dockerfile 是这样的:
bash
# build stage
FROM node:18 as build-stage
WORKDIR /app
COPY package.json .
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install
COPY . .
RUN npm run build
# production stage
FROM node:18 as production-stage
COPY --from=build-stage /app/dist /app
COPY --from=build-stage /app/package.json /app/package.json
WORKDIR /app
RUN npm install --production
EXPOSE 3000
CMD ["node", "/app/main.js"]
现在要改成这样:
使用pm2-runtime?
pm2 与 pm2-runtime的区别:
pm2-runtime是为 Docker 容器而设计的,它将应用程序保持在前台,从而使容器保持运行
pm2专为在后台发送或运行应用程序的正常使用而设计
docker 容器的生命周期就是 CMD 或 entrypoint 的生命周期。在这种情况下,使用 pm2 start 容器将在运行过程后立即死亡,导致无法访问,所以我们需要采用 docker-runtime start 的方式来启动。