部署 Node.js 应用之 PM2

什么是 pm2

PM2 是一个非常流行的 Node.js 应用进程管理工具,它帮助你管理和保持 Node.js 应用的高可用性。PM2 提供了进程守护、日志管理、负载均衡等功能,非常适合生产环境使用。

安装 pm2

npm install pm2 -g

验证是否安装成功

pm2 --version

PM2 常用命令

启动 Node.js 应用(启动打包后的)

pm2 start app.js

停止 Node.js 应用(启动打包后的)

pm2 stop app.js

停止 Node.js 应用,使用 pid 停止

pm2 stop <pid>

重启 Node.js 应用

pm2 restart app.js

重启 Node.js 应用,使用 pm2 应用名称的方式

pm2 restart <name>

查看所有正在运行的应用

pm2 list

查看应用状态

pm2 status

删除 Node.js 应用

pm2 delete <入口js文件>
pm2 delete <pm2应用名称>

查看日志

pm2 logs
pm2 logs <pm2应用名称>         # 查看某个应用的日志

清空日志

pm2 flush

PM2 配置文件

pm2.json

{
    "apps": [{
            "name": "app1",                             // 应用名称
            "script": "./app.js",                       // 启动脚本
            "instances": "max",                         // 启动实例数量
            "exec_mode": "cluster",                     // 使用 cluster 模式
            "watch": true,                              // 启用文件监控(自动重启)
            "env": {                                    // 开发环境变量
                "NODE_ENV": "development"
            },
            "env_production": {                         // 生产环境变量
                "NODE_ENV": "production"
            },
            "log_file": "./logs/app.log",                // 日志文件路径
            "error_file": "./logs/error.log",            // 错误日志文件路径
            "log_date_format": "YYYY-MM-DD HH:mm:ss"     // 日志日期格式
        },
        {
            "name": "app2",
            "script": "./app2.js",
            "instances": 1,
            "exec_mode": "fork",
            "watch": false
        }
    ]
}

参数说明:

apps 是一个数组,其中包含要启动的多个应用配置。每个应用可以有以下字段:

  • name: 应用的名称,用于标识应用。
  • script: 启动应用的脚本文件路径,通常是 Node.js 应用的入口文件,例如 app.js。
  • instances: 指定应用实例的数量。每个实例都将启动一个独立的 Node.js 进程。你可以使用它来并行处理多个请求,从而提升应用的性能,尤其是在多核 CPU 上,例如:
  • exec_mode: 执行模式,值为 fork(单进程)或 cluster(多进程)。以便更好地利用多核 CPU。当instances设置为多个时,fork 相当于独立的进程,没有多进程间的共享内存。cluster 自动为这些进程提供负载均衡,每个进程会共享主进程。
  • watch: 是否监视文件变化,并在文件变化时自动重启应用。在开发环境中非常有用。
  • env: 定义开发环境中的环境变量,通常用于开发模式。
  • env_production: 定义生产环境中的环境变量,用于生产模式。
  • log_file: 设置日志文件路径,记录应用的输出日志。例如:"./logs/app.log"
  • out_file:设置标准输出日志文件路径。例如:"./logs/app-out.log"
  • error_file: 设置错误日志文件的路径。例如:"./logs/app-error.log"
  • merge_logs: 设置是否合并多个实例的日志输出。默认值为 false
  • log_date_format: 设置日志输出的日期格式。例如:YYYY-MM-DD HH:mm:ss
  • autorestart:当应用崩溃或退出时是否自动重启。默认值为 true
  • min_uptime: 设置应用稳定运行的最小时间(以毫秒为单位)。如果应用崩溃或重启时间短于该时间,PM2 会认为它失败并停止重启。
  • max_restarts: 设置最大重启次数。如果应用在启动时多次失败(超过该次数),PM2 会停止重启。
  • max_memory_restart:应用的内存限制(以 MB 或 GB 为单位)。当应用的内存使用超过此限制时,PM2 会重启应用。例如:512M
  • pid_file:设置应用的 PID 文件路径。例如:"./logs/app.pid"
  • kill_timeout:设置在 PM2 终止应用时,等待进程停止的超时时间(毫秒)。默认为 1600 毫秒。
  • cron_restart:设置一个 Cron 表达式,根据定时任务重启应用。例如:"0 0 * * *"
  • interpreter:指定应用程序运行时使用的解释器
  • interpreter_args:为 Node.js 解释器传递的额外参数。
  • node_args:设置启动应用时传递给 Node.js 进程的命令行参数。

使用 pm2.json 文件 启动应用

pm2 start pm2.json

停止所有通过 pm2.json 文件启动的应用

pm2 stop pm2.json

如果你修改了 pm2.json 文件,可以使用以下命令重新加载配置

pm2 reload pm2.json