
PM2 的 -i 参数默认启用集群模式,但需配合 -- 分隔符后的实际脚本路径(而非 node 命令)才能生效;若误用 pm2 start node -i N -- script.js,PM2 会退化为 fork 模式。
pm2 的 `-i` 参数默认启用集群模式,但需配合 `--` 分隔符后的实际脚本路径(而非 `node` 命令)才能生效;若误用 `pm2 start node -i n -- script.js`,pm2 会退化为 fork 模式。
在 PM2 v5.3.0 及后续版本中,-i(或 --instances)参数本身即表示启用集群模式,但其行为高度依赖启动命令的写法。关键误区在于:不能将 node 作为主脚本显式传入。例如以下命令:
pm2 start node -n my-app -i 2 -- build
该写法会让 PM2 将 node 视为待执行的“应用脚本”,而 build 被当作 node 的参数——此时 PM2 实际运行的是多个独立的 node build 进程,彼此无通信、无负载均衡,属于 fork 模式(即使指定了 -i 2)。
✅ 正确做法是:直接指定你的应用入口文件(如 app.js 或 dist/index.js),由 PM2 自动调用 Node.js 并启用内置集群逻辑:
pm2 start app.js -n my-app -i 2
或带环境变量与参数:
pm2 start app.js -n my-app -i 2 -- --port=3000
此时 PM2 会自动设置 exec_mode: 'cluster',并基于 Node.js 原生 cluster 模块创建主进程(Master)与工作进程(Workers),实现 CPU 多核负载均衡与自动重启。
⚠️ 注意事项:
- 不要手动写 node app.js —— PM2 已内置 Node.js 执行器,显式调用会绕过集群机制;
- 若项目使用 TypeScript 或构建工具(如 tsc + build),请确保 start 指向编译后的 JS 入口(如 dist/index.js),而非构建命令本身;
- 验证是否为集群模式:运行 pm2 show my-app,检查输出中 exec_mode 字段应为 cluster,且 pid 列显示多个不同进程 ID;
- 如需更精细控制(如自定义 exec_mode、watch、env_production 等),推荐使用配置文件(ecosystem.config.js),它比 CLI 更可靠、可复用:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: './dist/index.js',
instances: 2,
exec_mode: 'cluster',
watch: false,
env: { NODE_ENV: 'development' },
env_production: { NODE_ENV: 'production' }
}]
};
启动方式:
pm2 start ecosystem.config.js --env production
总结:PM2 的 -i 参数原生支持集群模式,无需额外 flag;核心在于以应用文件为 script 参数,而非 node 命令。理解这一设计逻辑,即可避免 fork 与 cluster 模式的混淆,充分发挥多核服务器性能。










