Skip to content

PM2 快速上手指南

PM2 是 Node.js 的优秀运行时管理工具,专为简化和优化 Node.js 应用程序的生产部署与运行而设计。

pm2 官网 https://pm2.keymetrics.io/

1. PM2 的优势

  • 持续运行:即使应用出错或崩溃,也能自动重启。
  • 负载均衡:智能地自动分配入站连接到多个应用实例。
  • 日志集中管理:一处集中显示所有应用的日志。
  • 实时监控:实时查看所有应用的状态及细节性能指标。

2. 安装 PM2

选择以下任意一种方法全局安装 PM2:

bash
npm install pm2 -g

或者

bash
yarn global add pm2

3. PM2 常用命令

  • 启动pm2 start app.js - 启动并保护您的应用。
  • 查看列表pm2 list - 显示所有 PM2 托管的应用列表。
  • 监控应用pm2 monit - 查看应用的资源使用和日志。
  • 查看日志pm2 logs - 获取应用的实时日志。
  • 重启应用pm2 restart <appName>
  • 停止应用pm2 stop <appName>
  • 移除应用pm2 delete <appName>

使用 pm2 start 命令时,你可以提供一些参数来指定如何启动你的应用程序。以下是这个命令的常用参数:

  1. 应用入口文件 - 这是必需的,例如 pm2 start app.js 会启动 app.js 文件。

  2. -i--instances - 指定要启动的实例数量。对于多核机器,你可以使用此选项来启动多个应用实例。例如,pm2 start app.js -i max 将会为每个 CPU 核心启动一个实例。

  3. --name - 为启动的进程指定一个名字,这样在后续操作或检查日志时会更容易识别。例如:pm2 start app.js --name "myApp"

  4. -l--log - 指定一个文件来保存日志。例如:pm2 start app.js -l /path/to/logfile.log

  5. --watch - 监视文件更改并在检测到更改时自动重启应用。

  6. -e--error-log - 指定一个错误日志文件的路径。

  7. -o--output-log - 指定一个输出日志文件的路径。

  8. --env - 指定运行时的环境变量。例如,如果你在代码中使用了process.env.NODE_ENV,你可以使用 pm2 start app.js --env production 来设置 NODE_ENVproduction

  9. --cron - 设置一个 cron 作业来重启应用。这对于某些定期任务或周期性重启可能很有用。

  10. --max-memory-restart - 当应用使用的内存超过指定值时自动重启它。例如,pm2 start app.js --max-memory-restart 300M 会在应用程序消耗的内存超过 300MB 时重启它。

这只是一些常用的参数。pm2 有大量的配置和功能选项,可以通过查看其官方文档或使用 pm2 --help 来获取更多信息。

一个包含许多常见参数的示例

bash
pm2 start app.js \
--name "myApp" \
-i max \
--watch \
-l /path/to/combined_log.log \
-e /path/to/error_log.log \
-o /path/to/output_log.log \
--env production \
--cron "0 0 * * *" \
--max-memory-restart 300M \
--args "arg1 arg2"

在此命令中:

  • app.js 是应用程序的入口文件。
  • --name 为进程设置了名称为 "myApp"。
  • -i max 将为机器上的每个 CPU 核心启动一个实例。
  • --watch 会监视文件更改。
  • -l, -e, -o 分别设置了合并日志、错误日志和输出日志的路径。
  • --env 设置了运行时环境为 "production"。
  • --cron 设置了每天凌晨重启应用程序的 cron 作业。
  • --max-memory-restart 在应用程序使用的内存超过 300MB 时重新启动。
  • --args 向应用程序传递了 "arg1" 和 "arg2" 这两个参数。

请记住,这只是一个示例,并不意味着你应该在实际应用中使用所有这些参数。根据实际需要选择和组合参数,并确保彼此之间没有冲突。

4. 如何使用配置文件

通过 ecosystem.config.js 文件来定义及管理您的应用配置。例如:

javascript
// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: "money-manager",
      script: "index.js",
      instances: "max",
      exec_mode: "cluster",
      env_development: {
        NODE_ENV: "development",
        DOTENV_CONFIG_PATH: "./config/config.env.development",
      },
      env_production: {
        NODE_ENV: "production",
        DOTENV_CONFIG_PATH: "./config/config.env.production",
      },
    },
  ],
};

在这个配置文件中:

  • script: 指定要运行的主应用文件。
  • instances: 设置为 max 以在所有可用 CPU 核心上运行应用实例。
  • exec_mode: 设置为 cluster 以允许应用在多个核心上运行。
  • env_production: 这里定义的环境变量会在你使用 --env production 选项启动应用时被应用。

特别要注意的是,我们定义了 DOTENV_CONFIG_PATH 环境变量,它告诉 dotenv 在哪里找到配置文件。

5. 如何与 dotenv 和 package.json 整合

首先,配置您的 package.json

json
{
  "main": "index.js",
  "scripts": {
    ...
    "pm2:dev": "pm2-dev start ecosystem.config.js --env development",
    "pm2:prod": "pm2 start ecosystem.config.js --env production",
    ...
  }
}

然后,确保应用能正确加载 dotenv 的环境变量:

javascript
const express = require("express");
...
require("dotenv").config({ path: process.env.DOTENV_CONFIG_PATH });
...

完成以上配置后,您可以使用以下命令启动应用:

  • 开发环境
bash
npm run pm2:dev
  • 生产环境
bash
npm run pm2:prod

6. 与 Docker Compose 结合使用

要在 Docker 中运行你的应用,你可以使用以下 Dockerfile 配置:

dockerfile
FROM node:18.0.0

WORKDIR /app

COPY package.json /app/

RUN yarn install --registry=https://registry.npmmirror.com
RUN yarn global add pm2

COPY ./ /app

EXPOSE 3000

CMD ["pm2-runtime", "start", "ecosystem.config.js", "--env", "production"]

使用下面的 docker-compose.yml 文件结合 Docker Compose 来启动你的服务:

yml
version: "3.8"
services:
  money-manager:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production