node.js PM2部署项目

news2024/10/2 6:38:20

pm2 是什么

pm2 是一个守护进程管理工具,它能帮你守护和管理你的应用程序。通常一般会在服务上线的时候使用 pm2 进行管理。本文围绕以下重点进行讲解:安装pm2;命令行部署到PM2;PM2查看日志等命令;PM2进行负载均衡;PM2配置文件模式;日志插件pm2-logrotate;持久化PM2。
在这里插入图片描述

PM2官网 https://pm2.keymetrics.io/
PM2中文网 https://pm2.fenxianglu.cn/docs/start

安装pm2

首先我们先创建一个简单的 node 服务,新建文件夹执行npm init,然后装 pm2

npm i pm2 -g

准备测试代码

准备一个pm2目录,例如D:\workspace\nodejs\pm2
新建 index1.js 和 index2.js,写两个简单的 http 服务,然后用 pm2 进行管理
在这里插入图片描述

//index1.js
let http = require("http");
let server = http.createServer();
server.on("request", function (req, res) {
  console.log("------------------index1");
  res.write("hello pm2 https://zhengkai.blog.csdn.net/ ");
  res.end();
});

server.listen(3001, function () {
  console.log(`服务器启动成功,点击 http://localhost:3000/ 进行访问`);
});
//index2.js
let http = require("http");
let server = http.createServer();
server.on("request", function (req, res) {
  console.log("------------------index2");
  res.write("hello pm2 https://zhengkai.blog.csdn.net/ ");
  res.end();
});

server.listen(3002, function () {
  console.log(`服务器启动成功,点击 http://localhost:3001/ 进行访问`);
});

通过PM2启动node.js程序

接下来我们将使用 pm2 的start命令来分别启动这两个个程序

pm2 start index1.js
pm2 start index2.js

在这里插入图片描述
之后分别访问 http://localhost:3001/ 和访问 http://localhost:3002/ , 可以看到浏览器显示“hello pm2 https://zhengkai.blog.csdn.net/”
在这里插入图片描述

另外,如果你的代码有什么update的话,可以执行pm2 restart 0 1 (在只有少数几个应用的情况下,你可以很容易知道id)
在这里插入图片描述

查看日志,执行以下命令可以看到我们程序的日志,默认只加载最后15行

pm2 log
在这里插入图片描述

并且可以看到程序的日志被归档到C:\Users\mosho\.pm2\logs\

  • indexN-out.log
  • indexN-error.log

pm2 的命令还有很多,下面列举几个

  • 启动并查看日志 pm2 start api.js --attach
  • 启动并检测变更 pm2 start api.js --watch
  • 停止 1 个/多个/所有程序 pm2 stop id/id1 id2 id3/all
  • 杀死 1 个/多个/所有程序 pm2 delete id/id1 id2 id3/all
  • 重启 1 个/多个/所有程序 pm2 restart id/id1 id2 id3/all
  • 列出应用程序 pm2 ls
  • 查看监控面板 pm2 monit
  • 查看程序数据 pm2 show [id]

停止指定id的应用
在这里插入图片描述
删除指定应用(如果你以fork模式运行,需要进行负载均衡,则最好删除后重新start)
在这里插入图片描述

如何使用PM2进行负载均衡

NodeJS 是一个异步单线程语言,倘若不做任何多线程处理直接部署到服务器上,那么它也只能使用服务器的一个线程,这样是非常浪费服务器性能的,通常我们可以改造以下项目进行多并发的支持,然后以多线程的形式运行。

注意*:运行以下命令之前,请用pm2 ls查看并确认index1在列表中没有存在,如果存在请先删除pm2 delete 0 1

使用 pm2 只需一个命令就能让我们的程序充分利用服务器的 CPU,拿 index1.js 为例:

pm2 start index1 -i max
我的电脑是 6核 12线程,它就会开 12个线程
在这里插入图片描述

pm2 start index1 -i 2
也可以手工指定是2个线程

对于cluster模式的应用,可以使用pm2 stop {name}的方式来停止所有线程,例如pm2 stop index1
在这里插入图片描述

配置文件部署PM2

上面的例子我们都是使用命令行进行管理的,这样其实挺不方便的,好在 pm2 提供了配置文件的形式。

我们直接使用命令pm2 init simple即可生成一个简单的配置文件ecosystem.config.js,修改一下让它指向我们的两个服务

module.exports = {
  apps: [
    {
      name: "index1",
      script: "./index1.js",
    },
    {
      name: "index2",
      script: "./index2.js",
    },
  ],
};

我们将原先的进程都 kill 掉(可以pm2 stop all 然后pm2 delete all),然后执行pm2 start ecosystem.config.js,同样的我们的两个服务都被启动了
在这里插入图片描述

进阶配置

这里可以配置一些进阶的设置,例如注入环境变量,设置日志格式,设置定时重启,设置监听模式等等。

//https://zhengkai.blog.csdn.net/
module.exports = {
  apps: [
    {
      name: "index1", //name
      script: "./index1.js", //相对于pm2 start 的相对路径
      cwd: "", //要启动的应用程序的目录
      instances: 2, //要启动实例的数量,就是上面提到的负载
      watch: true, //是否启动监听
      env: { NODE_ENV: "development" }, // 将出现在您的应用程序中的 env 变量
      env_xxx: {
        NODE_ENV: "xxx", //使用pm2注入xxx变量进行切换
      },
      log_date_format: "YYYY-MM-DD HH:mm Z", //日志时间格式
      error_file: "./log/index-error.log", //错误文件路径
      out_file: "./log/index-out.log", //输出日志文件路径
      max_restarts: 10, //最大重启数
      restart_delay: 4000, //重启延迟时间ms
      autorestart: true, //是否自动重启
      cron_restart: "0 0 3 * * ?", //定时重启 使用cron表达式,每晚3点重启
    },
    {
      name: "index2",
      script: "./index2.js",
    },
  ],
};

在这里插入图片描述

日志分析与pm2-logrotate插件

作为一个应用系统,日志分析也是非常重要的。但是pm2 自带的日志功能是不支持日志分割的。随着时间的推移,日志文件会越来越大,不仅会影响性能,后期排查问题也十分麻烦。

log_date_format: "YYYY-MM-DD HH:mm Z", //日志时间格式
error_file: "./log/index-error.log", //错误文件路径
out_file: "./log/index-out.log", //输出日志文件路径

所以通常我们都需要对日志进行分割。日志分割操作很简单,只需要安装pm2-logrotate插件即可,注意这里是 pm2 install

pm2 install pm2-logrotate
在这里插入图片描述

  • Compress:是否通过 gzip 压缩日志
  • max_size:单个日志文件的大小
  • retain:保留的日志文件个数
  • dateFormat:日志文件名中的日期格式,默认是 YYYY-MM-DD_HH-mm-ss
  • rotateModule:是否把 pm2 本身的日志也进行分割,
  • workerInterval:检查文件时间间隔
  • rotateInterval:设置强制分割,默认值是 0 0 * * *,意思是每天晚上 0 点分割,这里使用的是 corn 表达式,不会的可以搜索一下

pm2-logrotate的一些命令和实践

查看默认配置
pm2 conf
在这里插入图片描述

设置日志大小为1K(线上建议10M左右的size并启用compress压缩模式)
pm2 set pm2-logrotate:max_size 1K
在这里插入图片描述

安装完插件,建议停止并删除所有服务,然后重新挂载。可以看到最后有一个Module模块并提示挂载了pm2-logrotate
pm2 stop all
pm2 delete all
pm2 start ecosystem.config.js
在这里插入图片描述
在这里插入图片描述

防止Pm2服务意外终止简易方法:Windows任务计划方式挂载PM2

1.首先先把任务保存和缓存起来。

pm2 save
在这里插入图片描述

2.然后新建一个bat文件(例如叫pm2-startup.bat),内容为恢复服务

pm2 resurrect
在这里插入图片描述
在这里插入图片描述

3.打开windows自带的任务计划管理,英文版搜索Task Scheduler
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意* : 记得这里起始于,输入一下pm2项目的路径,可以避免一些运行问题(例如路径)
在这里插入图片描述
(注意:双击进入计划任务属性,把安全选项修改为“不管用户是否登陆都运行” ,否则像server上的一些service account,是不需要登陆的,那么这个任务将不会起作用)*
在这里插入图片描述
需要输入一次密码
在这里插入图片描述

防止Pm2服务意外终止强力方法:Pm2-installer

那些什么node-windows, pm2 as windows那些都过时了,试试这个吧。
https://pm2.fenxianglu.cn/docs/general/persistent-application

https://github.com/jessety/pm2-installer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python心经(4)

这节记录一些内置模块的使用 目录 hashlib模块,,加密用 json模块 os模块 一个实用的案例: os模块的找文件的操作 随机生成random模块 时间相关模块 time,datetime hashlib模块,,加密用 以md5加密…

什么是Spring Cache?Spring项目如何使用?

前言 目前Spring Cloud微服务在Web项目中占据了主流地位,如果去面试关于Spring Cloud的岗位时,面试官一般都会提问你的项目是如何优化的,从哪些方面入手去优化。而缓存技术绝对是项目必不可少的,所以我们必须掌握好Java项目的缓存…

unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机

普通血条栏: 渐变色血条栏: 缓冲血条栏: 3D场景血条栏跟随玩家移动: 普通血条栏: 在Canvas下创建一个空物体HP bar,在空物体下方创建3个Image,分别为血条框bar 黑色,最大HP maxHP 白色,和当前HP currentHP 红色。(PS:注意先后顺序以调整显示的图层) 效果: …

java中排序

1.传统比较器格式 2.stream 3.结果 4.源码 List<String> list Arrays.asList("201305", "200305", "199009", "200208");Collections.sort(list, new Comparator<String>() {Overridepublic int compare(String o1, Stri…

SpringMVC 万字通关

文章目录 1. 什么是 Spring MVC?1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系 2. Spring MVC 有什么用 ?3. 如何学 Spring MVC ?3.1 Spring MVC 的创建3.2 实现连接功能3.2.1 RquestMapping 详解1. RequestMapping 支持什么请求?2. 请求限定3. GetMapping 和 PostMapping4. c…

Sharding-Sphere系列-主从配置和分库分表

主从配置和分库分表 Sharding-Sphere组成 Sharding-JDBC Sharding-Proxy Sharding-Sidecar&#xff08;TODO&#xff09; Sharding-JDBC表的概念 逻辑表 广播表 绑定表 Sharding-JDBC中的分片策略 自动分片算法 标准分片算法 复合分片算法 自定义分片算法 分布式…

Mybatis-Plus 自动属性填充与自定义Insert into语句顺序

前言&#xff1a;系统中使用了Mybatis-Plus 自动属性填充为实体统一进行属性的填值&#xff0c;在Mapper的xml 文件中 insert into 语句 使用 <if test"id ! null">id,</if> 进行判断会发现该属性是空的&#xff0c;明明已经为改字段进行了属性的自动填充…

百度2023年Q1财报解析:AI+生态战略加速助推

原创 | 文 BFT机器人 01 百度靠AI实现翻身 &#xff08;一&#xff09;盈利能力 百度凭借着强大的AI能力&#xff0c;成功地实现了从依赖搜索业务的互联网公司到AI公司的转型。 从盈利能力层面上看&#xff0c;在第一季度&#xff0c;百度实现了营收311.44亿元&#xff0c;同比…

unity愤怒的小鸟学习制作(二)

终于又开始了啦啦啦&#xff0c;我有一个自己的相机了&#xff0c;真开心&#xff0c;诶嘿 视频链接和素材如下&#xff1a;视频 小鸟的飞出 想要让小鸟在拉开弹弓之后能飞出去&#xff0c;就必须让这个组件失活&#xff0c;如下 所以我们更改脚本内容&#xff0c;加入&#…

HarmonyOS应用端云一体化开发主要流程

图示 主要步骤 序号 阶段 任务 说明 1 创建端云一体化开发工程 选择工程类型与云开发模板 确定工程类型&#xff1a;选择“Application”或“Atomic Service”页签&#xff0c;确定创建的是HarmonyOS应用工程还是原子化服务工程。选择云开发模板&#xff0c;包括通用云开…

【FMC202】基于FMC标准的1路CameraLink Full 输入、1路DVI输出 子卡模块

产品概述 FMC202是一款基于FMC接口标准的1路CameraLink Full模式&#xff08;或者2路CameraLink Base模式&#xff09;采集、1路HDMI&#xff08;DVI&#xff09;视频输出的子卡模块&#xff0c;该模块具有2个CameraLink端口&#xff08;SDR&#xff0c;26PIN&#xff09;&…

Docker部署apache superset

使用Docker compose在docker中部署Apache Superset 说明&#xff1a;部署步骤按照superset官网说明总结而来-2023年 1、第一步安装docker 、docker compose。 这里我选择手动下载rpm包&#xff0c;然后yum install *.rpm方式来安装。 下载地址&#xff1a;https://download.…

MADDPG-学习笔记(2)

注意&#xff1a;进行本文的实验前&#xff0c;为了加快训练速度&#xff0c;进行了参数调整 num-episodes&#xff1a;由60000改成了10000 lr:由0.01改成了0.1 batch-size:由1024改成了32 1.报错 1.1 AttributeError: Scenario object has no attribute benchmark_data …

ApiKit 介绍及基本用法

1、ApiKit介绍及下载 ApiKitAPI 管理 Mock 自动化测试 异常监控 团队协作 结合 API 设计、文档管理、自动化测试、监控、研发管理和团队协作的一站式 API 生产平台&#xff0c;从个人开发者到跨国企业用户&#xff0c;Apikit 帮助全球超过50万开发者和10万家企业更快、更好…

【Flutter】Flutter CLI (2):调试分析项目 flutter analyze 命令详解

文章目录 一、前言二、对现有项目进行分析和调试1. flutter analyze2. 修改代码暴露错误3. 再次执行flutter analyze4. 调试模式运行代码 flutter run三、本文涉及命令的完整说明1.flutter analyze四、总结一、前言 在上一篇文章中,我们对 Flutter CLI 的命令进行了分类,并通…

Array的扩展方法(from、find、findlndex、includes)

Array.from() 构造函数方法:Array.from() 将类数组或可遍历对象转换为真正的数组 示例 <script>// 构造函数方法:Array.from()// 将类数组或可遍历对象转换为真正的数组let arr {0: a,1: b,2: c,length: 3,};let arr1 Array.from(arr);console.log(arr1);//["…

对回溯的理解与思考(从决策树遍历角度分析)

对于回溯的经典问题&#xff0c;就是全排列和各种各样全排列的变体和八皇后问题。 算法框架 对于回溯算法框架。其实解决一个回溯问题&#xff0c;实际上就是一个决策树的遍历过程。 这也就是为什么在刷算法题之前&#xff0c;一定要从树的题目开始刷&#xff0c;后期可以很方…

检索 COM 类工厂中 CLSID 为 {} 的组件失败, 内存资源不足,无法处理此命令

如果您收到ERROR_NOT_ENOUGH_MEMORY消息&#xff0c;提示没有足够的存储空间来处理此命令描述&#xff0c;请按照本文中列出的故障排除步骤进行修复。 此错误代码影响Windows服务器&#xff0c;导致系统崩溃&#xff0c;并在错误日志中显示“没有足够的存储空间来处理此命令”。…

Qt+QtWebApp开发笔记(二):http服务器日志系统介绍、添加日志系统至Demo测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130762721 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Clickhouse 入门到精通-Clickhouse工作原理

Clickhouse 为什么做查询分析那么快&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#xff1f; 因为clickhouse使用了下列方案&#xff1a; clickhouse 数据分区clickhouse 列式存储clickhouse 一级索引&#xff08;主键索引&#…