PM2 快速上手指南
PM2 是 Node.js 的优秀运行时管理工具,专为简化和优化 Node.js 应用程序的生产部署与运行而设计。
pm2 官网 https://pm2.keymetrics.io/
1. PM2 的优势
- 持续运行:即使应用出错或崩溃,也能自动重启。
- 负载均衡:智能地自动分配入站连接到多个应用实例。
- 日志集中管理:一处集中显示所有应用的日志。
- 实时监控:实时查看所有应用的状态及细节性能指标。
2. 安装 PM2
选择以下任意一种方法全局安装 PM2:
npm install pm2 -g
或者
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
命令时,你可以提供一些参数来指定如何启动你的应用程序。以下是这个命令的常用参数:
应用入口文件 - 这是必需的,例如
pm2 start app.js
会启动app.js
文件。-i
或--instances
- 指定要启动的实例数量。对于多核机器,你可以使用此选项来启动多个应用实例。例如,pm2 start app.js -i max
将会为每个 CPU 核心启动一个实例。--name
- 为启动的进程指定一个名字,这样在后续操作或检查日志时会更容易识别。例如:pm2 start app.js --name "myApp"
。-l
或--log
- 指定一个文件来保存日志。例如:pm2 start app.js -l /path/to/logfile.log
。--watch
- 监视文件更改并在检测到更改时自动重启应用。-e
或--error-log
- 指定一个错误日志文件的路径。-o
或--output-log
- 指定一个输出日志文件的路径。--env
- 指定运行时的环境变量。例如,如果你在代码中使用了process.env.NODE_ENV
,你可以使用pm2 start app.js --env production
来设置NODE_ENV
为production
。--cron
- 设置一个 cron 作业来重启应用。这对于某些定期任务或周期性重启可能很有用。--max-memory-restart
- 当应用使用的内存超过指定值时自动重启它。例如,pm2 start app.js --max-memory-restart 300M
会在应用程序消耗的内存超过 300MB 时重启它。
这只是一些常用的参数。pm2 有大量的配置和功能选项,可以通过查看其官方文档或使用 pm2 --help
来获取更多信息。
一个包含许多常见参数的示例
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
文件来定义及管理您的应用配置。例如:
// 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
:
{
"main": "index.js",
"scripts": {
...
"pm2:dev": "pm2-dev start ecosystem.config.js --env development",
"pm2:prod": "pm2 start ecosystem.config.js --env production",
...
}
}
然后,确保应用能正确加载 dotenv 的环境变量:
const express = require("express");
...
require("dotenv").config({ path: process.env.DOTENV_CONFIG_PATH });
...
完成以上配置后,您可以使用以下命令启动应用:
- 开发环境
npm run pm2:dev
- 生产环境
npm run pm2:prod
6. 与 Docker Compose 结合使用
要在 Docker 中运行你的应用,你可以使用以下 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 来启动你的服务:
version: "3.8"
services:
money-manager:
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production