node.js PM2部署项目

文章更新
2023-05-21 更新NSSM安装服务的方式

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

单js项目部署:NSSM安装系统服务

1.首先到NSSM官网下载NSSM 2.24
http://www.nssm.cc/download
在这里插入图片描述
2.解压NSSM,找到win64/nssm.exe
在这里插入图片描述
3.执行一下命令进行安装

nssm install pm2service
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PLX31-EIP-MBTCP 以太网/IP到Modbus TCP/IP

PLX31-EIP-MBTCP ProSoft Technology的EtherNet/IP to Modbus TCP/IP通信网关允许在支持EtherNet/IP的控制器或设备与Modbus TCP/IP控制器或设备之间进行高速双向数据传输。 我们的Modbus TCP/IP驱动程序具有多种客户端和服务器功能,可实现更快的数据传输。此外&a…

【Linux】普通用户无法使用sudo指令的方法

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

云计算安全

前言 什么是云计算? 云计算就是一种新兴的计算资源利用方式,云计算的服务商通过对硬件资源的虚拟化,将基础IT资源变成了可以自由调度的资源池,从而实现IT资源的按需分配,向客户提供按使用付费的云计算服务。用户可以…

智能排班系统 【管理系统功能、操作说明——中篇】

文章目录 页面与功能展示企业管理角色管理用户管理系统管理员身份使用企业管理员身份使用门店管理员身份使用 门店管理职位管理排班规则设置节日管理消息管理 页面与功能展示 企业管理 企业管理页面如图 34所示,在企业管理页面,系统管理员可以查询所注…

Unity Shader variants (shader 变体)

官方地址 https://docs.unity3d.com/cn/2022.2/Manual/SL-MultipleProgramVariants.html 教程可以看这里 https://www.jianshu.com/p/48ad75f0b4b9 https://www.jianshu.com/p/3e6b84317097 变种用我自己的理解就是 能用程序控制的shader 举个例子 这里声明了 a b c d 四个变…

cpu 内核 逻辑处理器的关系

6核CPU,12个逻辑处理器 一颗内核在一个时间片内只能执行一个内核线程;当物理CPU使用了超线程技术后,在CPU的一颗内核中,利用就是利用其中空闲的执行单元,模拟出另外一个核心(并不是真正的物理运算核心&…

详解C语言assert宏

前言:我们经常在写代码时,发现一些大牛的代码中总有一句assert(表达式),经过在网上的学习,笔者也浅显的了解了assert的相关知识,assert一般用于规范代码,避免不必要的错误&#xff0…

【WOA-LSTM】基于WOA优化 LSTM神经网络预测研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【机器学习】信息量、香农熵、信息增益(增加例子,方便理解)

这节可以搭配 【机器学习】Logistic回归(重新整理)信息量(信息)信息量公式的推理过程 香农熵信息增益 【机器学习】Logistic回归(重新整理) B站视频:“交叉熵”如何做损失函数?打包…

css元素的显示和隐藏

1. display显示隐藏 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><st…

类和对象 --- 封装+对象特性

&#x1f442; 快乐E调 - 林澜叶 - 单曲 - 网易云音乐 &#x1f442; Plain Jane (Freestyle) - Ombre2Choc Nation - 单曲 - 网易云音乐 1.5倍速&#xff0c;跟着敲&#xff0c;初识C 目录 &#x1f3c6;封装 &#x1f333;属性和行为作为整体 &#x1f333;案例 -- 设置…

19-01 技术选型的道与术

系列目录导航&#x1f449; 什么是技术选型&#xff0c;技术选型的重要性 根据实际业务管理的需要&#xff0c;对硬件、软件以及所要用到的技术进行规格的选择狭义上的技术选型&#xff1a;团队决定选用哪种技术去解决问题&#xff0c;比如选用某个技术语言、某个技术框架去开…

人民大学与加拿大女王金融硕士项目——在现在憧憬美好的未来

未来是一个虚无缥缈的词汇&#xff0c;抓不住也看不到。未来里有着我们无限的希望&#xff0c;也有着美好的憧憬。未来究竟是怎样的呢&#xff0c;有人说现在的样子里藏着未来的模样。在职的你有没有为未来编织一副美丽的画卷呢&#xff1f;未来很远&#xff0c;远到只能靠想象…

Linux设备树:删除节点和属性的方法

[摘要]&#xff1a;本文主要介绍了在设备树中删除节点&#xff08;node&#xff09;和属性&#xff08;property&#xff09;的方法。为了便于理解&#xff0c;笔者先介绍了 dtsi 和 dts 的关系&#xff0c;然后构建了虚拟的需求场景&#xff0c;最终给出示例。 背景知识 设备…

shell 免交互

文章目录 Here Document 免交互实验多行注释基本命令 实验 Here Document 免交互 使用I/O重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令。是标准输入的一种替代品可以帮助脚本开发人员不必使用临时文件来构建输入信息&#xff0c;而是…

理光打印机连接电脑后不打印的原因及解决方法

理光打印机在使用时&#xff0c;可能会出现正常连接上理光打印机却没有反应的情况&#xff0c;出现无法打印的情况&#xff0c;下面&#xff0c;驱动人生为大家带来理光打印机连接后不打印的解决方案。 驱动人生分析&#xff0c;一般遇到理光打印机连接后不打印的情况&#xf…

python 的APScheduler配置的定时任务会被Miss掉

背景 python 的APScheduler配置的定时任务会被Miss掉&#xff0c;经常在控制台收到一些Miss的告警信息&#xff0c;就觉得是任务太多导致的&#xff0c;为了定位到具体的原因&#xff0c;看了一些源码&#xff0c;了解到了定时任务的6大模块的协同工作模式。异常信息及来源 异…

2022年深圳杯数学建模B题基于用电可靠性的配电网规划解题全过程文档及程序

2022年深圳杯数学建模 B题 基于用电可靠性的配电网规划 原题再现&#xff1a; 如果一批用户变压器&#xff08;下面简称用户&#xff09;仅由一个电源变电站&#xff08;下面简称电源&#xff09;供电&#xff0c;称为单供。这时配电网由电线和开关联接成以电源为根节点的树状…

Transformer应用之构建聊天机器人(二)

四、模型训练解析 在PyTorch提供的“Chatbot Tutorial”中&#xff0c;关于训练提到了2个小技巧&#xff1a; 使用”teacher forcing”模式&#xff0c;通过设置参数“teacher_forcing_ratio”来决定是否需要使用当前标签词汇来作为decoder的下一个输入&#xff0c;而不是把d…

< ElementUi组件库: el-progress 进度条Bug及样式调整 >

ElementUi组件库&#xff1a; el-progress 进度条Bug及样式调整 &#x1f449; 前言&#x1f449; 一、实现原理> 修改 el-progress 进度条样式 及 渐变进度条样式 &#x1f449; 二、案例代码&#xff08;前言效果图案例&#xff09;> HTML代码> CSS代码 &#x1f44…