【无标题】

Windows 生产环境 PM2 部署说明

  • [Windows 生产环境 PM2 部署说明](#Windows 生产环境 PM2 部署说明)
    • [1. 基础安装](#1. 基础安装)
    • [2. 静态 HTML / Vue / React / Vite 项目](#2. 静态 HTML / Vue / React / Vite 项目)
      • [2.1 使用 http-server](#2.1 使用 http-server)
      • [2.2 使用 serve](#2.2 使用 serve)
    • [3. Next.js 项目](#3. Next.js 项目)
    • [4. 普通 Node.js 后端项目](#4. 普通 Node.js 后端项目)
    • [5. 多服务配置示例](#5. 多服务配置示例)
    • [6. 常用 PM2 命令](#6. 常用 PM2 命令)
    • [7. 开机自启测试](#7. 开机自启测试)
    • [8. 查看服务运行端口](#8. 查看服务运行端口)
    • [9. 修改配置后的正确重启方式](#9. 修改配置后的正确重启方式)
    • [10. 注意事项](#10. 注意事项)

Windows 生产环境 PM2 部署说明

本文档总结 Windows 环境下使用 PM2 部署三类项目的方式:

  • 静态 HTML / Vue / React / Vite 打包项目
  • Next.js 项目
  • 普通 Node.js 后端项目

1. 基础安装

先安装 Node.js LTS 版本,然后全局安装 PM2:

cmd 复制代码
npm install -g pm2

如果需要 Windows 开机自启,继续安装:

cmd 复制代码
npm install -g pm2-windows-startup

建议固定 PM2_HOME,避免重启后 PM2 读取错目录:

cmd 复制代码
setx PM2_HOME D:\pm2

执行后关闭当前 CMD 窗口,重新打开一个新的 CMD,再确认:

cmd 复制代码
echo %PM2_HOME%

应该输出:

txt 复制代码
D:\pm2

创建 PM2 工作目录:

cmd 复制代码
mkdir D:\pm2

安装 Windows 开机启动:

cmd 复制代码
pm2-startup uninstall
pm2-startup install

2. 静态 HTML / Vue / React / Vite 项目

适用于打包后生成 distbuild 的前端项目,例如目录里有:

txt 复制代码
dist
  index.html
  assets

2.1 使用 http-server

安装 http-server

cmd 复制代码
npm install -g http-server

查看 http-server.cmd 路径:

cmd 复制代码
where http-server

通常路径类似:

txt 复制代码
C:\Users\Administrator\AppData\Roaming\npm\http-server.cmd

ecosystem.config.js 示例:

js 复制代码
module.exports = {
  apps: [
    {
      name: "web-client",
      cwd: "D:\\King\\your-project\\client",
      script: "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\http-server.cmd",
      args: "dist -p 3001 -a 0.0.0.0",
      interpreter: "none",
      autorestart: true,
      watch: false
    }
  ]
};

启动:

cmd 复制代码
cd /d D:\King\your-project\client
npm run build
pm2 start ecosystem.config.js --only web-client
pm2 save --force

如果打包目录是 build,把参数改为:

js 复制代码
args: "build -p 3001 -a 0.0.0.0"

如果直接运行当前目录:

js 复制代码
args: ". -p 3001 -a 0.0.0.0"

注意:Vue、React、Vite 如果使用 history 路由,刷新 /login/admin 这类路径时可能出现 404。这种情况下更推荐使用 serve -s

2.2 使用 serve

安装:

cmd 复制代码
npm install -g serve

查看路径:

cmd 复制代码
where serve

ecosystem.config.js 示例:

js 复制代码
module.exports = {
  apps: [
    {
      name: "web-client",
      cwd: "D:\\King\\your-project\\client",
      script: "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\serve.cmd",
      args: "-s dist -l 3001",
      interpreter: "none",
      autorestart: true,
      watch: false
    }
  ]
};

启动:

cmd 复制代码
cd /d D:\King\your-project\client
npm run build
pm2 start ecosystem.config.js --only web-client
pm2 save --force

3. Next.js 项目

Next.js 生产环境不要用 http-server 直接托管 .next,应该使用 next start

先构建:

cmd 复制代码
cd /d D:\King\your-project\client
npm install
npm run build

ecosystem.config.js 示例:

js 复制代码
module.exports = {
  apps: [
    {
      name: "next-client",
      cwd: "D:\\King\\your-project\\client",
      script: "node_modules\\next\\dist\\bin\\next",
      args: "start -p 3001",
      interpreter: "node",
      autorestart: true,
      watch: false,
      env: {
        NODE_ENV: "production"
      }
    }
  ]
};

启动:

cmd 复制代码
pm2 start ecosystem.config.js --only next-client
pm2 save --force

如果使用 npm run start 启动,也可以这样配置:

js 复制代码
module.exports = {
  apps: [
    {
      name: "next-client",
      cwd: "D:\\King\\your-project\\client",
      script: "C:\\Program Files\\nodejs\\npm.cmd",
      args: "run start",
      interpreter: "none",
      autorestart: true,
      watch: false,
      env: {
        NODE_ENV: "production",
        PORT: "3001"
      }
    }
  ]
};

Windows 下运行 .cmd 文件时,需要配置:

js 复制代码
interpreter: "none"

否则 PM2 可能会把 .cmd 文件当成 JavaScript 文件解析,出现类似错误:

txt 复制代码
SyntaxError: Unexpected token ':'

4. 普通 Node.js 后端项目

假设后端入口文件是 index.jsserver.js

ecosystem.config.js 示例:

js 复制代码
module.exports = {
  apps: [
    {
      name: "node-server",
      cwd: "D:\\King\\your-project\\server\\dist",
      script: "index.js",
      instances: 1,
      exec_mode: "fork",
      autorestart: true,
      watch: false,
      max_memory_restart: "500M",
      env: {
        NODE_ENV: "production",
        PORT: "3003"
      }
    }
  ]
};

启动:

cmd 复制代码
cd /d D:\King\your-project\server\dist
pm2 start ecosystem.config.js --only node-server
pm2 save --force

Node.js 代码必须读取环境变量端口:

js 复制代码
const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

如果代码写死:

js 复制代码
app.listen(3000);

那么 PM2 里的配置:

js 复制代码
env: {
  PORT: "3003"
}

不会生效。

5. 多服务配置示例

可以把前端和后端写在同一个 ecosystem.config.js

js 复制代码
module.exports = {
  apps: [
    {
      name: "king-client",
      cwd: "D:\\King\\project\\client",
      script: "node_modules\\next\\dist\\bin\\next",
      args: "start -p 3001",
      interpreter: "node",
      autorestart: true,
      watch: false,
      env: {
        NODE_ENV: "production"
      }
    },
    {
      name: "king-server",
      cwd: "D:\\King\\project\\server\\dist",
      script: "index.js",
      instances: 1,
      exec_mode: "fork",
      autorestart: true,
      watch: false,
      max_memory_restart: "500M",
      env: {
        NODE_ENV: "production",
        PORT: "3003"
      }
    }
  ]
};

启动全部服务:

cmd 复制代码
pm2 start ecosystem.config.js
pm2 save --force

只启动某一个服务:

cmd 复制代码
pm2 start ecosystem.config.js --only king-client
pm2 start ecosystem.config.js --only king-server

6. 常用 PM2 命令

查看服务:

cmd 复制代码
pm2 list

查看日志:

cmd 复制代码
pm2 logs
pm2 logs web-client
pm2 logs next-client
pm2 logs node-server

重启服务:

cmd 复制代码
pm2 restart web-client

停止服务:

cmd 复制代码
pm2 stop web-client

删除服务:

cmd 复制代码
pm2 delete web-client

保存当前进程列表:

cmd 复制代码
pm2 save --force

恢复保存的进程:

cmd 复制代码
pm2 resurrect

杀掉 PM2:

cmd 复制代码
pm2 kill

查看服务详情:

cmd 复制代码
pm2 describe node-server

查看服务环境变量:

cmd 复制代码
pm2 env node-server

7. 开机自启测试

启动服务后保存:

cmd 复制代码
pm2 save --force

测试恢复:

cmd 复制代码
pm2 kill
pm2 resurrect
pm2 list

如果 pm2 resurrect 后服务能恢复,说明 PM2 保存正常。

重启机器后再执行:

cmd 复制代码
pm2 list

应该能看到之前保存的服务。

如果重启后 pm2 list 为空,按下面检查:

cmd 复制代码
whoami
echo %USERPROFILE%
echo %PM2_HOME%
dir %PM2_HOME%

重点确认:

  • 重启前后是否为同一个 Windows 用户
  • %PM2_HOME% 是否一致
  • %PM2_HOME% 目录下是否有 dump.pm2
  • 是否执行过 pm2 save --force
  • 是否执行过 pm2-startup install

8. 查看服务运行端口

PM2 不会直接显示服务监听端口,可以通过 PID 查看。

先查看 PM2 进程:

cmd 复制代码
pm2 describe node-server

找到 pid,例如:

txt 复制代码
pid: 12345

然后执行:

cmd 复制代码
netstat -ano | findstr 12345

或者查看指定端口:

cmd 复制代码
netstat -ano | findstr :3003

输出示例:

txt 复制代码
TCP    0.0.0.0:3003    0.0.0.0:0    LISTENING    12345

最后一列就是进程 PID。

也可以根据 PID 查进程:

cmd 复制代码
tasklist /FI "PID eq 12345"

9. 修改配置后的正确重启方式

修改 ecosystem.config.js 后,建议删除旧进程再重新启动:

cmd 复制代码
pm2 delete 服务名
pm2 start ecosystem.config.js --only 服务名
pm2 save --force

例如:

cmd 复制代码
pm2 delete king-client
pm2 start ecosystem.config.js --only king-client
pm2 save --force

10. 注意事项

  • cwd 必须指向项目根目录或入口文件所在目录。
  • Windows 下运行 .cmd 文件时,需要配置 interpreter: "none"
  • Next.js 不建议用 http-server,应该使用 next start
  • 静态 HTML / Vue / React / Vite 打包产物可以使用 http-server
  • Vue / React / Vite 使用 history 路由时,更推荐 serve -s
  • Node.js 后端端口必须由代码读取 process.env.PORT 才能通过 PM2 配置。
  • pm2 save --force 保存的是当前 pm2 list 里的进程。
  • Windows 重启后恢复哪些进程,取决于 dump.pm2 文件内容。
  • 如果重启后 pm2 list 为空,优先检查 %PM2_HOME%、Windows 用户和 dump.pm2
相关推荐
灵性(๑>ڡ<)☆2 小时前
Java学习笔记--面向对象高级(多态)
笔记·学习
AA陈超3 小时前
003 XiYou 西游 — P0 阶段实施计划
c++·笔记·学习·ue5
沪上企服通4 小时前
上海地区代账服务供给侧的五种架构形态:从 pipeline SLA 到领域深度的选型笔记
笔记·架构
库玛西5 小时前
深入剖析 Linux 线程机制与分页式存储管理
linux·服务器·c++·笔记
奋发向前wcx5 小时前
y1,y2总复习笔记2 2026.7.15
java·笔记·算法
苦瓜汤补钙5 小时前
Oracle JDK8 环境配置-Win11
开发语言·数据库·笔记·oracle
你想知道什么?6 小时前
机器学习概念-学习笔记
笔记·学习·机器学习
三品吉他手会点灯6 小时前
嵌入式机器学习 - 学习笔记1.2.3 - 机器学习软件框架
人工智能·笔记·嵌入式硬件·学习·机器学习
AgCl237 小时前
JavaWeb个人笔记01--Maven到MyBatis
笔记·maven·mybatis