PM2管理node应用

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: PM2管理node应用

什么是PM2



pm2是基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。按官方的说法,PM2 是一个守护进程管理工具,帮助您管理和守护您的应用程序。它以简单直观的 CLI 命令行方式进行工作。


总的来说,PM2有以下几个功能:

  1. 社区中使用最广泛的Node.js进程管理工具,支持进程负载均衡
  2. 当一个进程宕机,pm2会自动重启该服务,保证node.js应用的高可用性
  3. 提供一部分的APM能力,如进程监控
  4. 由于pm2也是由node.js写的,所以可以很方便的跟随应用去部署


PM2的使用



官方文档说的很清楚,跟着文档来问题就不大pm2.keymetrics.io/docs/usage/…

安装PM2


npm install pm2 -g

启动一个应用

pm2 start app.js

参数的配置

# 给应用起一个别名
--name <app_name>
# 监听文件变化,当文件发生变化的时候会自动重新启动
--watch
# 指定日志文件
--log <log_path>


常见命令

# 列出 PM2 管理的所有应用程序的状态:
pm2 list
# 停止某个应用进程
pm2 stop pid / all
# reload
pm2 reload xxx
# restart
pm2 restart xxx


restart和reload的区别:pm2.io/docs/runtim…


总结:restart会杀死再重启这个应用。reload实现0秒停机时间的重新加载,总是保证有一个进程在跑。如果reload没有成功的话,他会变成restart


pm2.json



我们还可以通过pm2.json文件来统一管理pm2的启动方式,以下是我在项目中使用的配置


{
  "apps": [{
    "name": "no-vnc-serve",
    "script": "index.js",
    "cwd": "./",
    "watch":"true",
    "error_file":"./logs/pm2.log",
    "out_file":"./logs/pm2.log",
    "log_date_format":"YYYY-MM-DD HH:mm Z",
    "instance_var": "INSTANCE_ID",
    "ignore_watch": [
      "node_modules",
      "logs"
    ]
  }]
}


实现PM2自启动



笔者想在windows系统中开机后自启动一个项目,根据官方文档,我们需要安装pm2-install


全局安装

npm install pm2 -g

安装windows自启动包

npm install pm2-windows-startup -g

执行命令

pm2-startup install

使用pm2启动项目

pm2 save


重启电脑可以查看

pm2 ls 查看

pm2启动流程



PM2首先会启动一个Client进程,之后会将启动业务进程所需要的配置,通过rpc传递给守护进程,由守护进程去启动进程。


PM2 start命令执行完成后业务进程会在后台开始运行,当后续想再针对业务进行一些操作时,就可以通过列表查看进程对应的pid,name来进行操作,同样是通过Client 触发rpc请求到守护进程,实现逻辑。


image.png


守护进程的概念Daemon(守护进程) 是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或者等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务。守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。


pm2内置负载均衡



负载均衡是指将一组任务分配到一组资源上的过程,目的是使它们整体的处理更加高效。负载均衡可以优化响应时间,避免一些任务的计算节点不均匀过载而其他节点空闲

负载均衡主要有两种办法,静态算法和动态算法。静态算法,不需要考虑不同机器的状态;动态算法,通常更通用和更有效,但需要不同计算单元之间的信息交换(通信),会有影响性能的风险。


log4j日志管理



log4j配置文件


log4js.configure({
  appenders: { cheese: { type: "file", filename: "cheese.log" } },
  categories: { default: { appenders: ["cheese"], level: "error" } },
});

log4j的配置主要分成两个部分,分别是appenders和categories


appenders


appenders配置的是每一种的输出方式,你可以在appenders配置多种输出方式


out: {
    type: 'stdout',
},
dataFile: {
    type: 'dateFile',
    numBackups:7,//7天之前的文件即删除
    filename: '../logs/out.log',
    keepFileExt: true,
    maxLogSize: 20480000,
    backups: 4,
},

比如我这里配置了两种方式分别采用了stdout控制台输出和dataFile文件输出


categories


categories表示你选择你在appenders里面配置的那种输出方式输出


categories: {
    default:{
        appenders:['out','dataFile'],
        level:'debug', // 输出等级,只输出比这个等级高的
    },
},

这里我采用我在appenders里面配置的两种输出方式,即会输出到控制台和out.log这个文件中


实例化logger


// 当我在getLogger()里面不传任何参数的时候,默认对应categories里面default配置
// default配置再会根据我里面的appenders数组,去找appender中out和dataFile的配置
let logger = log4js.getLogger();

我们还可以实例出不同的logger,分别输出不同类型的文件


categories: {
    default: {
      appenders: ['consoleOut', 'default'],
      level: 'all',
    },
    error: {
      appenders: ['consoleOut', 'error'],
      level: 'warn',
    },
  },


// 普通级别的logger,输出到控制台和日期分类的文件
const defaultLogger = log4js.getLogger('default')
 // 错误信息的logger,输出到控制台和error.log中
const errorLogger = log4js.getLogger('error')


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
1月前
|
JavaScript 前端开发 API
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
129 2
|
3天前
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
|
1月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
|
2月前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第57天】本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。
|
1月前
|
JavaScript NoSQL 前端开发
使用 Node.js 和 MongoDB 构建实时聊天应用
【10月更文挑战第2天】使用 Node.js 和 MongoDB 构建实时聊天应用
|
2月前
|
JavaScript API 数据库
深入理解Node.js事件循环及其在后端开发中的应用
【9月更文挑战第3天】本文将深入浅出地介绍Node.js的事件循环机制,探讨其非阻塞I/O模型和如何在后端开发中利用这一特性来处理高并发请求。通过实际的代码示例,我们将看到如何有效地使用异步操作来优化应用性能。文章旨在为读者揭示Node.js在后端开发中的核心优势和应用场景,帮助开发者更好地理解和运用事件循环来构建高性能的后端服务。
|
3月前
|
运维 Cloud Native JavaScript
云端新纪元:云原生技术深度解析深入理解Node.js事件循环及其在异步编程中的应用
【8月更文挑战第27天】随着云计算技术的飞速发展,云原生已成为推动现代软件开发和运维的关键力量。本文将深入探讨云原生的基本概念、核心价值及其在实际业务中的应用,帮助读者理解云原生如何重塑IT架构,提升企业的创新能力和市场竞争力。通过具体案例分析,我们将揭示云原生技术背后的哲学思想,以及它如何影响企业决策和操作模式。
|
3月前
|
JavaScript 开发者
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第31天】 本文将带你走进Node.js的事件循环机制,通过浅显易懂的语言和实例代码,揭示其背后的工作原理。我们将一起探索如何高效利用事件循环进行异步编程,提升后端应用的性能和响应速度。无论你是Node.js新手还是有一定经验的开发者,这篇文章都能给你带来新的启发和思考。
|
3月前
|
JavaScript 前端开发 API
深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第29天】本文将深入浅出地介绍Node.js事件循环机制,并结合代码示例探讨其如何影响后端开发实践。我们将从事件循环的基本概念出发,逐步解析其工作原理和性能优化策略,旨在帮助开发者更好地理解和运用Node.js进行高效的后端开发。
|
3月前
|
JSON JavaScript 中间件
深入浅出Node.js后端开发之Express框架应用
【8月更文挑战第29天】本文将带领读者快速了解并掌握使用Express框架进行Node.js后端开发的基础和进阶知识。我们将一起探索Express的安装、基本使用方法,并通过实际代码示例学习如何搭建一个简单的Web服务器。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的指导和灵感。