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 项目
适用于打包后生成 dist 或 build 的前端项目,例如目录里有:
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.js 或 server.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。