使用pm2运行node应用的流程步骤

 更新时间:2024年03月15日 08:36:42   作者:云牧  
PM2是一个功能强大的进程管理工具,专为 Node.js 应用设计,它提供了进程管理、日志管理、负载均衡和性能监控等功能,帮助开发者轻松应对生产环境中的各种挑战,本文给大家介绍了使用pm2 运行node应用的流程步骤,需要的朋友可以参考下

为什么使用 pm2

在生产环境中运行 Node.js 应用时,我们面临着一系列挑战:如何确保应用崩溃后能够自动重启?如何将应用的日志输出到指定文件以便分析?如何充分利用多核CPU来提升应用性能?以及如何监控应用的资源占用情况?这些问题都可以通过PM2(Process Manager 2)来解决。
PM2是一个功能强大的进程管理工具,专为 Node.js 应用设计。
它提供了进程管理、日志管理、负载均衡和性能监控等功能,帮助开发者轻松应对生产环境中的各种挑战。

启动 pm2

首先安装 pm2:

npm install pm2 -g

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

nest new pm2-test -p npm
cd pm2-test
pnpm build
pm2 start ./dist/main.js

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

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

pm2 日志管理

查看下日志:

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 查看。
查看单个进程的日志:

pm2 logs 进程名
pm2 logs 进程id

日志清空,使用 pm2 flush 或者 pm2 flush 进程名|id查看 main 进程的前 100 行日志:pm2 logs main --lines 100

pm2 进程管理

PM2提供了丰富的进程管理功能,包括启动、重启、停止和删除进程等。
只需要执行 pm2 start 的时候带上几个选项就好了:
超过 100M 内存自动重启:

pm2 start app.js --max-memory-restart 100M

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

pm2 start app.js --cron-restart="0 0 * * *"

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

pm2 start app.js --watch

不自动重启:

pm2 start app.js --no-autorestart

pm2 负载均衡

再就是负载均衡,node 应用是单进程的,而为了充分利用多核 cpu,我们会使用多进程来提高性能。
node 提供的 cluster 模块就是做这个的,pm2 就是基于这个实现了负载均衡。
我们只要启动进程的时候加上 -i num 就是启动 num 个进程做负载均衡的意思:

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:

pm2 scale main 1

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

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

pm2 scale main +3

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

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

pm2 stop all
pm2 delete all

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

pm2 stop app_name_or_id
pm2 delete app_name_or_id

app_name_or_id 替换为应用程序名称或者 PM2 分配给应用程序的 ID
可以通过 pm2 list 命令查看所有 PM2 管理的应用程序及其状态。

pm2 监控

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

pm2 monit

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

当进程多了之后,难道都要手动通过命令行来启动么?
pm2 支持配置文件的方式启动多个应用。执行 pm2 ecosystem,会创建一个配置文件:

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 命令跑应用。

打包镜像:

docker build -t nest-pm2-test:v1.0 .

运行镜像:

docker run -p 3000:3000 -d nest-pm2-test:v1.0

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

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

以上就是使用pm2 运行node应用的流程步骤的详细内容,更多关于pm2 运行node应用的资料请关注脚本之家其它相关文章!

相关文章

  • node.js中的fs.realpathSync方法使用说明

    node.js中的fs.realpathSync方法使用说明

    这篇文章主要介绍了node.js中的fs.realpathSync方法使用说明,本文介绍了fs.realpathSync的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 深入解析桶排序算法及Node.js上JavaScript的代码实现

    深入解析桶排序算法及Node.js上JavaScript的代码实现

    桶排序Radix Sort算法利用分治思想将元素分入各桶中排序后汇总,以下我们就来深入解析桶排序算法及Node.js上JavaScript的代码实现,需要的朋友可以参考下
    2016-07-07
  • Node.js中同步和异步编程的区别及使用方法

    Node.js中同步和异步编程的区别及使用方法

    在Node.js中,同步和异步编程是两种不同的处理方式。同步方式会阻塞程序的执行,而异步方式则不会。通过掌握它们的区别和使用方法,可以更好地实现程序的性能优化和功能扩展。同时,需要注意异步编程中的回调地狱问题,使用Promise可以更好地处理异步编程
    2023-05-05
  • node koa2实现上传图片并且同步上传到七牛云存储

    node koa2实现上传图片并且同步上传到七牛云存储

    这篇文章主要介绍了node koa2实现上传图片并且同步上传到七牛云存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Node.js文本文件BOM头的去除方法

    Node.js文本文件BOM头的去除方法

    这篇文章主要给大家介绍了关于Node.js文本文件BOM头的去除方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用socket.io实现简单聊天室案例

    使用socket.io实现简单聊天室案例

    这篇文章主要介绍了使用socket.io实现简单聊天室案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Node.js 中判断一个文件是否存在

    Node.js 中判断一个文件是否存在

    这篇文章主要记录一些 Node.js 应用中的小知识点,如果你 Google/Baidu “Node.js 如何判断文件是否存在” 发现给出的很多答案还是使用的 fs.exists,这里不推荐使用 fs.exists 你可以选择 fs.stat 或 fs.access。
    2020-08-08
  • node.js在Linux下执行shell命令、.sh脚本的问题

    node.js在Linux下执行shell命令、.sh脚本的问题

    很多时候需要多个命令来完成一项工作,而这个工作又常常是重复的,这个时候我们自然会想到将这些命令写成sh脚本,下次执行下这个脚本一切就都搞定了,下面就是发布代码的一个脚本示例
    2022-01-01
  • node.JS路径解析之PATH模块使用方法详解

    node.JS路径解析之PATH模块使用方法详解

    path模块包含一系列处理和转换文件路径的工具集,通过 require('path') 可用来访问这个模块。本文将详细介绍path模块
    2020-02-02
  • Node.js中安全调用系统命令的方法(避免注入安全漏洞)

    Node.js中安全调用系统命令的方法(避免注入安全漏洞)

    这篇文章主要介绍了Node.js中安全调用系统命令的方法(避免注入安全漏洞),本文讲解的一般是连接字符串会时出的安全问题情况,需要的朋友可以参考下
    2014-12-12

最新评论