使用 pm2 运行 node 应用

为什么使用 pm2

在生产环境中运行 Node.js 应用时,我们面临着一系列挑战:如何确保应用崩溃后能够自动重启?如何将应用的日志输出到指定文件以便分析?如何充分利用多核CPU来提升应用性能?以及如何监控应用的资源占用情况?这些问题都可以通过PM2(Process Manager 2)来解决。

PM2是一个功能强大的进程管理工具,专为 Node.js 应用设计。

它提供了进程管理、日志管理、负载均衡和性能监控等功能,帮助开发者轻松应对生产环境中的各种挑战。

启动 pm2

首先安装 pm2:

bash 复制代码
npm install pm2 -g

跑一个 node 应用,这里跑 Nest 应用:

bash 复制代码
nest new pm2-test -p npm
cd pm2-test
pnpm build
pm2 start ./dist/main.js

这个 node 已经运行并且被 pm2 管理起来了。

可以使用 pm2 start 跑多个进程。

pm2 日志管理

查看下日志:

bash 复制代码
pm2 logs

pm2 会把所有进程的日志打印出来,通过前面的 "进程id|进程名字" 来区分,比如 0|main

所有的进程会写到日志文件中去,在 ~/.pm2/logs 下,以 "进程名-out.log""进程名-error.log" 分别保存不同进程的日志:

比如 main-out.log 里保存了 main 进程的正常日志,而 main-error.log 里保存了它的报错日志。

可通过 cat ~/.pm2/logs/main-out.log 查看。

查看单个进程的日志:

bash 复制代码
pm2 logs 进程名
pm2 logs 进程id

日志清空,使用 pm2 flush 或者 pm2 flush 进程名|id

查看 main 进程的前 100 行日志:pm2 logs main --lines 100

pm2 进程管理

PM2提供了丰富的进程管理功能,包括启动、重启、停止和删除进程等。

只需要执行 pm2 start 的时候带上几个选项就好了:

超过 100M 内存自动重启:

bash 复制代码
pm2 start app.js --max-memory-restart 100M

支持 corn 表达式,每天午夜(00:00)重启:

bash 复制代码
pm2 start app.js --cron-restart="0 0 * * *"

当文件内容改变自动重启:

bash 复制代码
pm2 start app.js --watch

不自动重启:

bash 复制代码
pm2 start app.js --no-autorestart

pm2 负载均衡

再就是负载均衡,node 应用是单进程的,而为了充分利用多核 cpu,我们会使用多进程来提高性能。

node 提供的 cluster 模块就是做这个的,pm2 就是基于这个实现了负载均衡。

我们只要启动进程的时候加上 -i num 就是启动 num 个进程做负载均衡的意思:

bash 复制代码
pm2 start app.js -i max 
pm2 start app.js -i 0

-i max 让 PM2 自动设置进程数为最大值。
-i 0 则让 PM2 自动根据 CPU 核心数动态设置进程数。

用多进程的方式跑 nest 应用:

可以看到启动了 8 个进程,因为我是 8 核 cpu。

跑起来之后,还可以动态调整进程数,通过 pm2 scale:

bash 复制代码
pm2 scale main 1

此时 main 的集群调整为 1 个进程。

我们同样可以添加进程数:

bash 复制代码
pm2 scale main +3

现在变成 4 个进程了,通过这些方式可以动态伸缩进程的数量,pm2 会把请求分配到不同进程上去。这就是负载均衡功能。

我们同样可以停止和删除所有 pm2 的进程:

bash 复制代码
pm2 stop all
pm2 delete all

还可以停止删除单个进程:

bash 复制代码
pm2 stop app_name_or_id
pm2 delete app_name_or_id

app_name_or_id 替换为应用程序名称或者 PM2 分配给应用程序的 ID

可以通过 pm2 list 命令查看所有 PM2 管理的应用程序及其状态。

pm2 监控

性能监控功能,执行 pm2 monit:

bash 复制代码
pm2 monit

这里可以看到不同进程的 cpu 和内存占用情况。

当进程多了之后,难道都要手动通过命令行来启动么?

pm2 支持配置文件的方式启动多个应用。执行 pm2 ecosystem,会创建一个配置文件:

bash 复制代码
pm2 ecosystem


我们就可以把启动的选项保存在这个配置文件,pm2 根据配置文件自动执行这些命令。

然后用 pm2 start ecosystem.config.js 就可以批量跑一批应用。

pm2 网站

访问 pm2 的网站,登录,创建 bucket:

然后执行下面 pm2 link xxx:

再执行 pm2 plus 就会打开 bucket 对应的网页,在线监控本地的应用。

docker 结合 pm2

一般都是 docker 镜像内安装 pm2 来跑 node 应用:

之前我们写的 Nest 的 dockerfile 需要更改一下:

pm2-runtime 代表 node 命令跑应用。

打包镜像:

bash 复制代码
docker build -t nest-pm2-test:v1.0 .

运行镜像:

bash 复制代码
docker run -p 3000:3000 -d nest-pm2-test:v1.0

可以在 docker 看到 pm2 打印的日志。在 terminal 使用 pm2 的命令:

现在这个容器内的 node 进程在崩溃时就会自动重启。

相关推荐
前端老宋Running1 分钟前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔1 分钟前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户4445543654263 分钟前
Android的自定义View
前端
WILLF4 分钟前
HTML iframe 标签
前端·javascript
用户638982245895 分钟前
使用Hutool的ExcelWriter导出复杂模板,支持下拉选项级联筛选
后端
程序员鱼皮6 分钟前
10个免费的网站分析工具,竟然比付费的更香?
后端·程序员·数据分析
码一行14 分钟前
Eino AI 实战: Eino 的文档加载与解析
后端·go
码一行14 分钟前
Eino AI 实战:DuckDuckGo 搜索工具 V1 与 V2
后端·go
未秃头的程序猿15 分钟前
🚀 设计模式在复杂支付系统中的应用:策略+工厂+模板方法模式实战
后端·设计模式
踏浪无痕16 分钟前
@Transactional的5种失效场景和自检清单
spring boot·后端·spring cloud