前言

在Node.js项目中,进程管理是一个重要的部分。pm2 是一个非常流行的Node.js进程管理工具,它可以帮助我们管理和监控Node.js应用的运行状态。本文将介绍 pm2 的安装和基本使用方法,更好地管理Node.js项目。

ps:博主经常喜欢折腾些小玩意,用的是自己的服务器。但是在部署这些小玩意的时候,启动后要持久化,由于有些小玩意并不支持自带的命令,所以就写了一个关于pm2命令的使用指南,方便以后使用。

介绍

PM2官方网站 | Github
pm2 是一个Node.js进程管理器,专为生产环境下的应用程序设计。

  • 提供了进程守护、负载均衡、日志管理、性能监控等功能。它允许你轻松地启动、停止、重启和监控Node.js应用程序,并提供了友好的命令行接口和强大的API。
  • 它可以自动重启崩溃的应用,支持负载均衡,还提供了详细的日志管理和监控功能。
  • pm2 使得Node.js应用的部署和管理变得更加简单和高效。

安装

在Linux系统上安装 pm2 非常简单,只需执行以下命令

1
2
3
4
5
# 使用npm全局安装PM2
npm install pm2 -g

# 验证成功
pm2 --version

启动应用

启动一个Node.js应用非常简单,只需运行以下命令

1
pm2 start app.js

常用命令

1
2
3
4
5
6
7
8
9
10
# 列出所有进程
pm2 list
# 启动应用
pm2 start <name>
# 停止应用
pm2 stop <id 或 name>
# 重启应用
pm2 restart <id 或 name>
# 删除应用
pm2 delete <id 或 name>

基础命令

名称 描述
pm2 list 列出所有进程
pm2 start [应用名] 启动应用程序
pm2 stop [应用ID或应用名] 停止应用程序
pm2 restart [应用ID或应用名] 重启应用程序
pm2 delete [应用ID或应用名] 删除应用程序
pm2 logs 查看所有应用程序日志
pm2 logs [应用ID或应用名] 查看应用程序日志
pm2 flush 清空日志信息
pm2 monit 监控所有进程的实时状态
pm2 save 保存当前的进程列表,以便在服务器重启后恢复
pm2 reload [应用ID或应用名] 重载指定的应用程序,通常用于无停机重启
pm2 resurrect 恢复之前保存的进程列表
pm2 ecosystem

pm2 init
生成示例配置文件

均衡负载

  1. 静态服务器,将目录dist作为静态服务器根目录,端口为9090
    1
    pm2 serve ./dist 9090
  2. max 表示PM2将自动检测可用CPU的数量并运行尽可能多的进程,max可以自定义,如果是4核CPU,设置为2者占用2个
    1
    pm2 start app.js -i max

示例配置文件

使用pm2 ecosystempm2 init命令生成的配置文件ecosystem.config.js

1
pm2 start ecosystem.config.js --env production

ecosystem.config.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
28
29
30
module.exports = {
apps : [{
name : 'API', //应用名
script : 'app.js', //应用文件位置
env: {
PM2_SERVE_PATH: ".", //静态服务路径
PM2_SERVE_PORT: 8080, //静态服务器访问端口
NODE_ENV: 'development' //启动默认模式
},
env_production : {
NODE_ENV: 'production' //使用production模式 pm2 start ecosystem.config.js --env production
},
instances:"max", //将应用程序分布在所有CPU核心上,可以是整数或负数
watch:true, //监听模式
output: './out.log', //指定日志标准输出文件及位置
error: './error.log', //错误输出日志文件及位置,pm2 install pm2-logrotate进行日志文件拆分
merge_logs: true, //集群情况下,可以合并日志
log_type:"json", //日志类型
log_date_format: "DD-MM-YYYY", //日志日期记录格式
}],
deploy : {
production : {
user : 'node', //ssh 用户
host : '212.83.163.1', //ssh 地址
ref : 'origin/master', //GIT远程/分支
repo : 'git@github.com:repo.git', //git地址
path : '/var/www/production', //服务器文件路径
post-deploy : 'npm install && pm2 reload ecosystem.config.js --env production' //部署后的动作
}
}

博主示例

列举几个博主正在使用的例子

  1. hexo_run.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //run
    const { exec } = require('child_process')
    exec('hexo server -p 8000',(error, stdout, stderr) => {
    if(error){
    console.log('exec error: ${error}')
    return
    }
    console.log('stdout: ${stdout}');
    console.log('stderr: ${stderr}');
    })
  2. hugo_run.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //run
    const { exec } = require('child_process');
    exec('hugo server --bind 0.0.0.0 --port 1313 --baseURL http://nav.renyuxin.cn', (error, stdout, stderr) => {
    if (error) {
    console.error(`exec error: ${error}`);
    return;
    }
    console.log(`stdout: ${stdout}`);
    console.log(`stderr: ${stderr}`);
    });