• 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/ 进行访问`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    //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/ 进行访问`);
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通过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",
        },
      ],
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    我们将原先的进程都 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",
        },
      ],
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述

    日志分析与pm2-logrotate插件

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

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

    所以通常我们都需要对日志进行分割。日志分割操作很简单,只需要安装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
    在这里插入图片描述

  • 相关阅读:
    基于ssm的员工工资培训奖惩管理系统
    houdini vellum 显卡驱动造成解算崩溃笔记
    启动dubbo消费端过程提示No provider available for the service的问题定位与解决
    力扣题解( 最长递增子序列的个数)
    LRU缓存(哈希+双链表)
    基于“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用
    A. Everyone Loves to Sleep
    C语言第二十七弹---内存函数
    mysql检查表、分析表、优化表
    程序员的数学课09 似然估计:如何利用 MLE 对参数进行估计?
  • 原文地址:https://blog.csdn.net/moshowgame/article/details/130763991