pm2进程管理Koa2和Next项目

425 阅读3分钟

一、前言

pm2是一个进程管理工具,维护一个进程列表,用它来管理node进程,负责所有运行的进程并查看node进程的状态,也支持性能监控、日志、监听代码变化、负载均衡等功能,而且配置简单,指令也比较见名知意。

二、安装&目录建立

1.运行以下指令全局安装

$ npm install -g pm2

2.查看安装是否成功,若出现版本号就代表安装成功了,我这里的版本是5.1.2,包括安装后得到的路径也有显示C:\User\JAY.pm2

$ pm2 -v 

image.png

3.安装成功后在安装的默认路径就可以看到自动生成了以下目录

$HOME/.pm2/logs // 包括所有应用的日志
$HOME/.pm2/pids // 包括所有应用的 pids
$HOME/.pm2/pm2.log // pm2 日志
$HOME/.pm2/pm2.pid // pm2 pid

三、常用命令

1.基础的启动命令(正式环境启动一般使用第四标题的方法)

$ pm2 start app.js

image.png

我们可以在最基本的启动命令后面,添加一些参数选项,去满足我们的需求,常用的参数选项如下:

  • --watch:监听应用目录的变化,一旦发生变化,自动重启。
  • -i or --instance:启用多少个实例,可用于负载均衡,如果 -i 0 或者 -i max,则根据当前机器核数确定实例数目。
  • --ignore-watch:排除监听的目录或文件,可以是特定的文件名,也可以是正则。
  • -n or --name:应用的名称,查看应用信息的时候可以用到。
  • -o or --output path:标准输出日志文件的路径。
  • -e or --error path:错误输出日志文件的路径。

2.查看所有进程

$ pm2 list

image.png

3.重启某个进程

$ pm2 restart app.js

4.停止某个进程

$ pm2 stop name | id

5.停止所有进程

$ pm2 stop all

6.删除某个进程

$ pm2 delete name | id

7.删除所有进程

$ pm2 delete all

8.查看某个进程的详细信息

$ pm2 describe name | id

四、配置信息&启动

我们在正式环境启动项目,肯定是需要增加一些特殊的要求比如监听、日志等,如果还是按照基础的start启动则需要打一些繁琐的命令,难以记忆且容易出错,所以我们采用更方便更高端的方式来配置启动项目 如下:我在koa2项目根路径增加了pm2.config.json文件,我们启动只需要在该目录下执行这个json文件即可pm2 start .\pm2.config.json

{
    "apps": {
        "name": "blog-koa2",       // 项目名          
        "script": "bin/www",             // 执行文件
        "cwd": "./",                     // 根目录
        "args": "",                      // 传递给脚本的参数
        "interpreter": "",               // 指定的脚本解释器
        "interpreter_args": "",          // 传递给解释器的参数
        "watch": true,                   // 是否监听文件变动然后重启
        "ignore_watch": [                // 不用监听的文件
            "node_modules",
            "public"
        ],
        "exec_mode": "cluster_mode",     // 应用启动模式,支持 fork 和 cluster 模式
        "instances": "max",              // 应用启动实例个数,仅在 cluster 模式有效 默认为 fork
        "error_file": "./logs/app-err.log",         // 错误日志文件
        "out_file": "./logs/app-out.log",           // 正常日志文件
        "merge_logs": true,                         // 设置追加日志而不是新建日志
        "log_date_format": "YYYY-MM-DD HH:mm:ss",   // 指定日志文件的时间格式
        "min_uptime": "60s",                        // 应用运行少于时间被认为是异常启动
        "max_restarts": 30,                         // 最大异常重启次数
        "autorestart": true,                        // 默认为 true, 发生异常的情况下自动重启
        "restart_delay": "60"                       // 异常重启情况下,延时重启时间
        "env": {
           "NODE_ENV": "production",                // 环境参数,当前指定为生产环境
           "REMOTE_ADDR": ""               
        },
        "env_dev": {
            "NODE_ENV": "development",              // 环境参数,当前指定为开发环境
            "REMOTE_ADDR": ""
        },
        "env_test": {                               // 环境参数,当前指定为测试环境
            "NODE_ENV": "test",
            "REMOTE_ADDR": ""
        }
    }
}

五、高阶应用

1.负载均衡

可以使用 -i 参数配置集群数,实现负载均衡

$ pm2 start app.js -i 3 // 开启三个进程
$ pm2 start app.js -i max // 根据机器CPU核数,开启对应数目的进程 

2.日志查看

我们可以通过打开日志文件查看日志外,还可以通过 pm2 logs 来查看实时日志,这点有对于线上问题排查

$ pm2 logs

3.监控

我们可以使用以下命令,查看当前通过 pm2 运行的进程的状态

$ pm2 monit

4.开机自启动

在 linux 中,设置开机自启动,只需要执行以下两个步骤:

  1. 运行 pm2 startup,即在/etc/init.d/ 目录下生成 pm2-root 的启动脚本,且自动将 pm2-root 设为服务;
  2. 运行 pm2 save ,会将当前 pm2 所运行的应用保存在 /root/.pm2/dump.pm2 下,当开机重启时,运行pm2-root 服务脚本,并且到 /root/.pm2/dump.pm2 下读取应用并启动;
  3. 但在 windows 中运行 pm2 startup 时,会报以下错误,因为其不适合 windows 系统; 我们需要额外安装其它库,如下所示:
$ npm install pm2-windows-startup -g
$ pm2-startup install

然后我们只需要运行以下保存命令,就可以将现在正在运行的服务添加到开机自启动命令中;后面即使服务器开机重启,也会将我们保存的服务自动重启;

$ pm2 save

六、可能遇到的问题

1.在项目路径中直接使用pm2命令报错
image.png

解决方案:

1.打开 powerShell 用管理员身份运行
2.输入命令:set-ExecutionPolicy RemoteSigned
3.输入A或者Y即可

七、使用pm2管理next服务端渲染项目

$ yarn start
or
$ npm start

改成

$ pm2 start yarn --name "blog-front" --interpreter bash -- start
or
$ pm2 start npm --name "blog-front" --interpreter bash -- start