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点:

  1. pm2 show node-api → interpreter 显示的路径是你的 fnm node,不是系统node
  2. pm2 list 中 restart 数值为0,不持续上涨
  3. 服务器重启,应用自动 online

10、切换node版本之后操作

如果 fnm 切换了新的node版本:

  1. 修改 ecosystem.config.js 里面 interpreter 为新的 fnm which node 路径
  2. npm install pm2 -g(新版本node也要全局装pm2)
  3. pm2 reload ecosystem.config.js --env production
  4. pm2 save 更新开机快照