fnm + pm2 + ecosystem.config.js 的项目模板
1、环境前提
已安装 fnm,确认你的 node 真实二进制路径
# 拿到node绝对路径,复制输出结果备用
fnm which node
示例输出:
/root/.fnm/node-versions/v22.14.0/installation/bin/node
这个路径要填进
interpreter,pm2系统服务不读shell的fnm环境变量。
2、项目目录结构
your-project/
├── app.js # node入口
├── ecosystem.config.js # pm2配置(复制下面)
├── logs/ # pm2输出日志目录,手动创建
├── package.json
└── .gitignore
创建logs文件夹
mkdir -p logs
ecosystem.config.js(直接复制修改两处:name、interpreter路径)
module.exports = {
apps: [
{
name: "node-api", // 你的服务名称,自己改
script: "./app.js",
interpreter: "/root/.fnm/node-versions/v22.14.0/installation/bin/node", // ⚠️替换成 fnm which node 的输出
instances: "max",
exec_mode: "cluster",
// 生产环境变量
env: {
NODE_ENV: "production",
PORT: 3000
},
// 开发环境变量
env_dev: {
NODE_ENV: "development",
PORT: 3001
},
autorestart: true,
watch: false, // 生产务必关闭;开发改为 true
watch_options: {
ignored: ["node_modules", "logs"]
},
max_memory_restart: "500M", // 内存超限自动重启
restart_delay: 3000, // 崩溃后延迟3s再重启,防止死循环
min_uptime: "10s",
// 日志
out_file: "./logs/out.log",
error_file: "./logs/err.log",
merge_logs: true,
log_date_format: "YYYY-MM-DD HH:mm:ss"
}
]
}
.gitignore
node_modules
logs
ecosystem.config.js
不要把 ecosystem.config.js 提交git,本机node绝对路径不一样,可以保存一份
ecosystem.config.sample.js给团队参考。
3、安装pm2(当前fnm node版本下全局安装)
npm install pm2 -g
pm2 -v
4、启动服务
# 生产环境启动
pm2 start ecosystem.config.js --env production
# 开发环境启动
# pm2 start ecosystem.config.js --env dev
# 查看状态
pm2 list
# 看日志
pm2 logs node-api
5、配置开机自启(fnm环境关键步骤)
interpreter已经写好node绝对路径,开机就不会跑系统node了
# 生成开机服务脚本,执行它输出的命令
pm2 startup
# 保存当前pm2进程快照,服务器重启自动拉起
pm2 save
验证:pm2 save 会生成 ~/.pm2/dump.pm2。
测试:服务器重启后执行 pm2 list,应用应自动 online。
开机自启相关命令
pm2 save # 更新快照;新增/删除服务后务必执行
pm2 cleardump # 清除开机保存的服务
pm2 unstartup # 移除pm2开机服务
pm2 resurrect # 手动恢复快照
6、安装日志切割 pm2‑logrotate(生产必装)
pm2 install pm2-logrotate
# 设置规则:单文件最大100M,保留最近30份日志
pm2 set pm2-logrotate:max_size 100M
pm2 set pm2-logrotate:retain 30
7、完整部署上线脚本(deploy.sh,可复制)
更新代码零停机发布脚本,
pm2 reload集群优雅重载不中断连接
新建deploy.sh
#!/bin/bash
echo "===== pull code ====="
git pull
echo "===== install dependencies ====="
npm install --production
echo "===== pm2 reload zero downtime ====="
pm2 reload ecosystem.config.js --env production
echo "===== show status ====="
pm2 list
赋予执行权限
chmod +x deploy.sh
以后上线只需要:
./deploy.sh
注意:
reload仅对cluster模式生效;fork模式请使用pm2 restart。
8、常用日常操作集合
pm2 list
pm2 show node-api
pm2 logs node-api --lines 200
pm2 monit
# 停止
pm2 stop node-api
# 删除
pm2 delete node-api
# 清空日志
pm2 flush
9、常见校验清单
部署完核对3点:
pm2 show node-api→ interpreter 显示的路径是你的 fnm node,不是系统nodepm2 list中 restart 数值为0,不持续上涨- 服务器重启,应用自动 online
10、切换node版本之后操作
如果 fnm 切换了新的node版本:
- 修改
ecosystem.config.js里面interpreter为新的fnm which node路径 npm install pm2 -g(新版本node也要全局装pm2)pm2 reload ecosystem.config.js --env productionpm2 save更新开机快照