配置文件 ecosystem.config.js 详解
- 定位:
- PM2 声明式配置的唯一权威入口。
- 命令行传参适合演示,生产配置一律进 ecosystem 文件:可版本管理、可复制、可
--env切换环境。- 文件形式:
ecosystem.config.js(CommonJS 导出对象)最常见;- 也支持
.json、.cjs。- 文件里可以做逻辑(循环生成 apps、读取 .env),这是它比 json 更常用的原因。
最小骨架
js
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'web', // 应用名
script: './src/server.js', // 入口脚本(相对 cwd)
},
// 可以继续加第二个、第三个应用…
],
};启动方式:
bash
pm2 start ecosystem.config.js # 启动文件里声明的所有 app
pm2 start ecosystem.config.js --only web # 只启动其中名为 web 的那个
pm2 start ecosystem.config.js --env production # 注入 env_production(见 §4)
--only web也可用序号(文件内第几个 app,从 0 起)。
常用字段速查表
默认值以官方文档(撰写时最新 7.x)为准(本表为主要常用项;完整清单见文末官方链接)。4.x–7.x 的核心字段基本一致。
| 字段 | 作用 | 常用默认 |
|---|---|---|
name | 应用名(pm2 ls 显示) | 脚本 basename |
script | 入口脚本路径(必填) | —— |
cwd | 工作目录(脚本内相对路径的基准) | 启动时所在目录 |
args | 传给脚本的参数(字符串或数组) | 无 |
interpreter | 解释器路径,如 node、ts-node、babel-node | node |
node_args / interpreter_args | 传给解释器的参数,如 --max-old-space-size=4096 | 无 |
exec_mode | fork 或 cluster | fork |
instances | 实例数:0/max=全部 CPU 核、-1=核数-1、数字=固定个数(对 Node 应用设 instances 会自动启用 cluster) | 1 |
max_memory_restart | 内存超过该值自动重启,如 "512M" | 不限制 |
env | 默认注入的环境变量(对象) | {} |
env_<name> | 配合 --env <name> 注入的环境 | 无 |
autorestart | 进程异常退出后是否自动重启 | true |
max_restarts | “不稳定重启”达到该次数后进程转 errored、不再自动拉起 | 16(见 06) |
min_uptime | 一次“稳定运行”的最小时长(可写 "10s"/"1h");未达标的快速重启计为不稳定 | 未设时按“重启间隔 <1s”判定(见 06) |
restart_delay | 每次重启前的固定等待 | 0ms |
exp_backoff_restart_delay | 指数退避重启:首间隔=设定值,逐次翻倍,上限 15s;稳定运行 >30s 后重置 | 不设置则不启用(见 06) |
cron_restart | cron 表达式定时重启 | 无 |
kill_timeout | 停止时等待优雅退出的上限,超时 SIGKILL | 1600ms |
listen_timeout | 等待应用"就绪"的最长时间(配合 wait_ready) | 3000ms |
wait_ready | 启动/重载时等待应用发 ready 消息 | false |
watch | true 或路径数组:监听变更自动重启 | false |
ignore_watch | watch 时忽略的路径(node_modules 等) | [] |
merge_logs | 多实例(cluster)日志合写同一文件(去掉文件名中的 pid 后缀;combine_logs 是别名) | false |
time | 日志行自动加时间戳 | false |
log_date_format | 自定义日志时间戳格式;与 time 同属“日志加时间前缀”,官方未标废弃,二者取一 | 无 |
out_file / error_file | 自定义 stdout/stderr 日志路径(设为 /dev/null 可禁用落盘) | ~/.pm2/logs/<name>-out-<pid>.log / -error-<pid>.log |
log_file | 设置后 stdout/stderr 合并写入该文件 | 不设置 |
pid_file | 自定义 PID 文件路径 | ~/.pm2/pids/<name>-<id>.pid |
instance_var | cluster 下区分实例的环境变量名 | NODE_APP_INSTANCE |
increment_var | 若设置,PM2 会为该环境变量自动递增(多实例取不同值) | 无 |
namespace | 命名空间分组(列表过滤/成组操作) | 无(支持程度随版本,见 §5) |
source_map_support | 崩溃堆栈是否做 source map 转换 | true |
force | 同名已存在时是否强制覆盖启动 | false |
kill_signal | 停止时先发该信号让进程优雅退出,超时再 SIGKILL | SIGINT(全局可用环境变量 PM2_KILL_SIGNAL 改) |
⚠️ 表内"默认值"一列为常见实现值,实施前请以官方文档与
pm2 describe实际输出为准;与事实表不一致处本文会在附录勘误。
完整示例(一段顶十段)
js
// ecosystem.config.js
const { parsed } = require('dotenv').config(); // 可选:把项目 .env 读进来
module.exports = {
apps: [
// ── API 服务:cluster 模式,吃满 CPU ──
{
name: 'api',
script: './dist/server.js',
exec_mode: 'cluster',
instances: 'max', // = CPU 核数
max_memory_restart: '512M',
kill_timeout: 5000, // 优雅退出宽限 5s
listen_timeout: 8000,
wait_ready: true, // 应用就绪后 send('ready')
time: true, // 日志带时间戳
error_file: '/var/log/app/api-error.log',
out_file: '/var/log/app/api-out.log',
merge_logs: true,
env: {
NODE_ENV: 'development',
PORT: 3000,
...parsed, // 合入 .env 内容
},
env_production: {
NODE_ENV: 'production',
PORT: 8080,
},
},
// ── 定时任务 worker:单实例、自动重启要克制 ──
{
name: 'cron-worker',
script: './jobs/worker.js',
exec_mode: 'fork',
instances: 1,
autorestart: true,
restart_delay: 3000, // 崩了等 3s 再拉
max_restarts: 5,
exp_backoff_restart_delay: 100,
cron_restart: '0 3 * * *', // 每天 3 点整点重启(可选,防内存涨)
},
],
};对应的启停:
bash
pm2 start ecosystem.config.js --env production
pm2 reload ecosystem.config.js --env production # 发版用 reload(cluster 零停机)
pm2 stop ecosystem.config.js
pm2 delete ecosystem.config.js
pm2 start ecosystem.config.js --only api环境变量管理(高频考点)
原则:环境变量属于"进程启动参数",写死在启动那一刻,而不是随时可变的 shell 变量。
三种注入方式
js
env: { NODE_ENV: 'development', DEBUG: '*' }, // ① 默认 env,任何启动都会带上
env_production: { NODE_ENV: 'production' }, // ② 只在 --env production 时合并bash
# ③ 命令行临时覆盖(不推荐在生产用,容易"人肉失忆")
FOO=bar pm2 start app.js--env 的语义
pm2 start ecosystem.config.js:注入env;pm2 start ecosystem.config.js --env production:注入env并覆盖/追加env_production中的键;- 同一键在
env与env_production都有时,env_xxx优先。
从 .env 读取(推荐做法)
PM2 本身不解析 .env,在配置文件中用 dotenv 读出后展开即可:
js
// ecosystem.config.js
require('dotenv').config(); // 读取项目根 .env 到 process.env
module.exports = {
apps: [{
name: 'api',
script: 'app.js',
env: { ...process.env }, // 一次性展开
}],
};注意:
pm2 restart不会刷新环境变量——env是启动时固化的。改了配置请pm2 delete+pm2 start(或pm2 restart --update-env用 shell 环境覆盖)。
不要在生产用 --update-env 当常规手段
--update-env 会把当前 shell 的全部环境灌给进程,容易把机器上无关变量带进去、掩盖"变量从哪来"的问题。生产应坚持:环境只来自 ecosystem 文件(+ .env)。
多应用 / 批量管理
一个配置文件可以管理多个 app,彼此共享同一份启动逻辑:
bash
pm2 start ecosystem.config.js # 全部启动
pm2 restart ecosystem.config.js # 全部重启
pm2 reload ecosystem.config.js --env production
pm2 delete ecosystem.config.js # 全部删除
pm2 ls --namespace prod # 只列出 prod 命名空间的进程namespace 用于把进程分成若干逻辑组:
pm2 ls --namespace <ns>过滤、pm2 restart <ns>等成组操作;ecosystem 配置项与 CLI 的支持程度以本机版本帮助为准。
命令行旗标 ↔ 字段对照(记不住就回来查)
| 想实现 | CLI | ecosystem 字段 |
|---|---|---|
| 多核多进程 | -i max | exec_mode:'cluster', instances:'max' |
| 代码改了自动重启 | --watch | watch:true + ignore_watch |
| 内存超限重启 | --max-memory-restart 512M | max_memory_restart:'512M' |
| 定时重启 | --cron-restart "0 3 * * *" | cron_restart:'0 3 * * *' |
| 日志带时间 | --time | time:true |
| 多实例日志合并 | --merge-logs | merge_logs:true |
| 优雅停 | --kill-timeout 5000 | kill_timeout:5000 |
| 等就绪再算活 | --wait-ready | wait_ready:true + 应用发 ready |
| 自定义日志路径 | —— | out_file / error_file |
| 生产环境变量 | --env production | env + env_production |
常见误区
- 改完 ecosystem 不生效:配置文件只在
start/startOrRestart/reload ecosystem.config.js时被读取;改了文件要用这些命令重新加载,pm2 restart <name>读的是 daemon 里已固化的参数。 - 把
instances当数量上限:它是"这次启动几个",不是"最多几个"。 env写在 apps 外:环境必须在每个 app 对象内(或在 apps 数组外用变量共享再展开)。- 日志路径指向不存在目录:out_file/error_file 的上级目录需先创建,PM2 不会帮你 mkdir。
- watch 开着上生产:
watch默认 false;生产开了会在发布拷贝文件时反复重启,务必watch:false。
