这可能是你见过最全的Node.js应用程序管理与部署:使用PM2进行进程管理

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
简介: node是单线程应用,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。pm2(process manager)是一个进程管理工具,可以用它来管理node进程,负责所有的node进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。

背景

node是单线程应用,单线程最大的弊端就是无法利用多核CPU带来的优势来提升运行效率。

pm2(process manager)是一个进程管理工具,可以用它来管理node进程,负责所有的node进程,并查看node进程的状态,也支持性能监控,负载均衡等功能。

pm2优势

  1. 内建负载均衡:pm2使用Node.js的cluster模块,可以在服务器上的所有CPU核心上运行多个应用实例,实现负载均衡。
  2. 后台运行:与直接在前台运行Node.js应用程序相比,pm2可以将应用程序在后台运行,更加稳定。
  3. 零秒停机重启:pm2可以在应用程序停止之后立即重启,减少了停机时间。
  4. 处理不稳定的进程:pm2可以监测应用程序的运行状态,当进程发生异常(如无限循环)时,可以停止并重启不稳定的进程。
  5. 程序崩溃自动重启:如果应用程序崩溃,pm2可以自动重启它,确保应用程序的可靠性。
  6. 服务器重新启动时自动重启:当服务器重新启动时,pm2可以自动重新启动之前运行的应用程序,保持应用的持久性。
  7. 控制台检测查看:pm2提供了控制台界面,可以方便地查看应用程序的状态、日志和性能指标等信息。

安装pm2

全局安装

使用npm或yarn进行全局安装:

// npm
npm install pm2 -g

// yarn
yarn global add pm2
AI 代码解读

更新升级

pm2 update
AI 代码解读

注意:升级 pm2 时需要注意 Node.js 版本是否兼容。如果之前设置了 pm2 的自启动(startup)功能,在升级后需要重新执行自启动命令。

// 删除自启动的应用程序
pm2 unstartup
// 设置开机自启动
pm2 startup
AI 代码解读

应用程序配置方式

使用PM2管理应用程序有两种方式:命令行方式和配置文件方式。

命令行方式

pm2 start [name|node|config|command|sh] -i 4

  • name:应用程序名字;
  • node:入口文件(如app.js);
  • command:应用程序命令("npm run start");
  • config:配置文件(ecosystem.config.js);
  • sh:配置脚本。

可以使用不同的参数来配置应用程序的启动方式。下面是一些常用的参数:

    -i 4         # cluster mode 模式启动4个app.js的应用实例。4个应用程序会自动进行负载均衡
    --name="app" # 启动应用程序并命名为 "app"
    --watch      # 当文件变化时自动重启应用
    --env        # 环境
    --attach     # 实时日志流
    --arg1 --arg2     # 传递参数到应用程序
    --max-memory-restart 300M     # 最大内存自动重启(间隔30s)
    --restart-delay=3000     # 自动重启延时时间
    --no-autorestart      # 禁止自动重启
AI 代码解读

常见操作命令:

// Start启动
pm2 start app.js

// Stop停止
pm2 stop app.js

// Restart重启
pm2 restart app.js

// Delete删除
pm2 delete app.js
AI 代码解读

image.png

配置文件方式

pm2 支持配置 js、yml、json 文件格式。尤其 pm2 在管理多个应用程序的时候,使用配置文件管理更方便。

ecosystem.config.js

pm2 init simple # 初始化生成一个ecosystem.config.js

module.exports = {
   
   
  apps : [{
   
   
    name   : "app",
    script : "./app.js"
  }, {
   
   
    name   : "worker",
    script : "./worker.js"
  }]
}
AI 代码解读

pm2 start ecosystem.config.js # 通过设置js配置文件来启动应用程序

name: "app"      # 名字
script:"./app.js"      # 路径
watch:[boolean|array]   # 文件变化时自动重启应用[所有文件true|指定文件夹如['doc']]
watch_delay: 1000       # 更新间隔
ignore_watch : ["node_modules"]        # 忽略的文件夹
max_memory_restart: "300M"        # 设置最大内存重启(间隔30s)
restart_delay: 3000     # 自动重启延时时间
autorestart: false      # 禁止自动重启
AI 代码解读

通过设置 配置文件 可以操作应用程序(如:start/stop/restart/delete )。

# Start
pm2 start ecosystem.config.js

# Stop
pm2 stop ecosystem.config.js

# Restart
pm2 restart ecosystem.config.js

# Delete
pm2 delete ecosystem.config.js
AI 代码解读

以上执行 配置文件 ,那么配置文件中的所有应用程序都会发生相应变化。

pm2提供了对配置文件中某个应用单独处理 -only

pm2 start ecosystem.config.js --only app

也可以同时处理多个应用。

pm2 start ecosystem.config.js --only "app,worker"

开机自启动

pm2可以通过设置开机自启动,来保证当出现服务/宿主机出现重启时,可以及时启动pm2管理的应用程序。

pm2 startup

image.png

生成自启动脚本后,复制粘贴执行脚本 sudo env......

*注意:如果要保证开启自启动pm2应用程序,需要保存pm2应用程序列表。

pm2 save

删除自启动应用程序

pm2 unstartup

logs

pm2-logrotate

pm2本身可以实现日志输出,但是pm2的日志文件不能自动分割,会导致文件越来越大,查看日志也麻烦。

安装pm2-logrotate(切记是pm2 install,而不是npm)

pm2 install pm2-logrotate

配置pm2-logrotate

pm2 set pm2-logrotate:[option][value]

pm2 set pm2-logrotate:compress true

Options:
    max_size             当一个文件的大小超过这个值时,它将会对其进行分割(默认10M)。
    retain               保留日志文件数量(默认为30个文件日志)。
    compress             是否启用压缩处理所有的旋转日志(默认false)。
    dateFormat           日志文件名称格式(默认格式YYYY-MM-DD_HH-mm-ss)。
    rotateModule         像其他应用程序一样旋转pm2模块的日志(默认true)。
    workerInterval       检查日志大小的时间间隔(默认30秒)。
    rotateInterval       定时执行旋转(默认每天午夜0 0 * * *)。
    TZ                   偏移保存日志文件的标准tz数据库时区(默认系统时间)
AI 代码解读

配置完成pm2-logrotate,需要restart应用程序。

执行完install后,会生成4个文件。

/Users/tal/.pm2/logs/app1-out.log                # 文件记录的就是`console.log`输出
/Users/tal/.pm2/logs/app1-error.log              # 记录的是错误输出
/Users/tal/.pm2/logs/pm2-logrotate-error.log     # 记录的是分割的异常日志文件
/Users/tal/.pm2/logs/pm2-logrotate-out.log       # 记录的是分割的日志文件
AI 代码解读

分割的日志文件

1|pm2-logr | "/Users/tal/.pm2/logs/pm2-logrotate-error__2022-04-28_00-02-54.log" has been created
1|pm2-logr | "/Users/tal/.pm2/logs/app1-out__2022-04-28_00-02-54.log" has been created
1|pm2-logr | "/Users/tal/.pm2/logs/app1-error__2022-04-28_00-02-54.log" has been created
AI 代码解读

pm2 logs

pm2 logs [options] [id|name|namespace]

pm2 logs --lines 200

Options:
    --raw                 out与err日志分类输出
    --err                 显示错误日志
    --out                 显示console日志
    --lines <n>           显示最新的共n条日志
    -h, --help
AI 代码解读

image.png

终端的仪表板:

若是想看 pm2 在终端的整体情况,执行终端的仪表板操作。

pm2 monit
AI 代码解读

image.png

Cluster Mode

Cluster Mode 集群模式将在所有可用CPU上扩展,自动进行负载均衡,将很大程度上提高应用程序的性能和可靠性。

命令行方式:

pm2 start app.js -i [max|number]

  • -i 开启指开启集群模式。
  • max|number 值代表PM2将自动检测可用CPU的数量,并运行尽可能多的进程。

配置文件方式:

在配置文件中通过exec_mode、instances设置.

module.exports = {
   
   
  apps : [{
   
   
    script    : "api.js",
    exec_mode : "cluster",
    instances : "max"
  }]
}
AI 代码解读

Deployment System

PM2还提供了一套强大的部署系统,可帮助您简化应用程序的部署过程。能满足在同一台或多台服务器部署deploy

pm2 deploy \ \ \

  • configuration_file:配置文件
  • environment:环境
  • command:命令
pm2 deploy app.json prod setup       # 设置“prod”远程服务器

Commands:
    setup                运行远程安装命令
    update               更新部署到最新版本
    revert [n]           恢复版本到第n次部署
    curr[ent]            输出当前版本提交信息
    prev[ious]           输出上一版本提交信息
    exec|run <cmd>       执行给定的<cmd>
    list                 列出之前的部署提交信息
    [ref]                部署到[ref], "ref"设置, 新标记
AI 代码解读

需要提供一个名为app.json的配置文件,其中包含有关部署环境、服务器和应用程序的详细信息。使用PM2的部署系统,您可以轻松地将应用程序部署到不同的服务器上。

image.png

基本命令

1、显示信息

pm2 [list|ls|l|status] # 列表 PM2 启动的所有的应用程序

pm2 monit # 每个应用程序的CPU和内存占用情况

pm2 show [name|id] # 应用程序的基本信息、情况

pm2 list --sort [name|id|pid|memory|cpu|status|uptime][:asc|desc] #排序[列表字段][正序|倒序]

2、程序启动

pm2 start app.js # 启动app.js应用程序

pm2 restart [all|name1 name2] # 终止并重启应用

pm2 reload [all|name1 name2] # 重新加载(0秒的停机)

pm2 resurrect # 重新加载保存的应用列表

pm2 gracefulReload all # 以群集模式重新加载所有应用程序

pm2 scale api 10 # 把名字叫api的应用扩展到10个实例

pm2 reset [name] # 重置应用程序统计

3、停止

pm2 stop [all|name|id|pid] # 停止应用程序

pm2 delete [all|name|id] # 关闭并删除应用程序

4、设置开机自启动

pm2 startup # 创建服务开机自启动

pm2 save # 保存当前应用列表,用于设置服务自启动

5、日志

pm2 logs [无|name] # 显示应用程序的日志(无,指所有应用程序)

pm2 flush [无|name] # 清空日志文件

6、安装升级

pm2 update # 更新升级

pm2 install pm2-logrotate # 安装模块(这里是日志自动分割

pm2 uninstall pm2-logrotate # 卸载模块

7、远程部署

pm2 deploy app.json prod setup # 设置远程服务器

pm2 deploy app.json prod revert 2 # 恢复版本到第2次部署

通过掌握这些常用命令,我们可以更好地使用PM2进行应用程序的管理和部署,提高开发效率和运行稳定性。

总结

总结起来,PM2作为一款强大的进程管理工具,通过自动重启、负载均衡、日志管理、部署系统等一系列功能,极大地简化了应用程序的部署与管理。无论是小型应用还是大型系统,PM2都能帮助开发人员更好地掌控应用程序的运行状态,提高开发效率和用户体验。如果您还没有尝试过PM2,现在就是时候了!

相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
77 23
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
41 2
【01】Cocos游戏开发引擎从0开发一款游戏-cocos环境搭建以及配置-Cocos Creator软件系统下载安装-node环境-优雅草卓伊凡
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等