引言:为什么需要PM2?
在Node.js生态中,进程管理是保障服务稳定性和高可用性的核心环节。随着业务复杂度的提升,开发者需要面对多进程调度、异常重启、日志收集、性能监控等挑战。传统的手动管理方式(如通过node app.js直接启动)在生产环境中显得力不从心。
PM2(Process Manager 2) 作为一款功能全面的进程管理工具,通过自动化和智能化的机制,为Node.js应用提供了从开发到部署的全生命周期支持。对于Vue3项目而言,虽然前端项目本身是静态资源,但在生产环境中同样需要稳定的服务进程来提供访问。
一、PM2核心功能详解
1.1 进程守护与自动重启
PM2最核心的功能之一是进程守护。当服务崩溃或意外退出时,PM2会自动重启应用,无需手动干预,保证服务7x24小时运行。这对于生产环境至关重要,避免了因单点故障导致的服务中断。
1.2 集群模式与负载均衡
PM2支持集群模式,可以自动利用多核CPU资源,将请求分发到多个进程,显著提升服务的并发处理能力。通过简单的配置,就能实现多实例负载均衡。
1.3 日志统一管理
PM2会自动记录服务的标准输出和错误日志,方便排查问题。你可以自定义日志路径,还可以安装pm2-logrotate插件实现日志自动切割,防止磁盘被日志文件撑满。
1.4 监控与性能统计
通过命令行或可视化工具,你可以实时查看服务的CPU、内存使用情况,掌握运行状态。pm2 monit命令提供了交互式监控界面,pm2 show可以查看单个服务的详细信息。
1.5 系统自启动
PM2支持设置开机自启动,服务器重启后服务自动恢复,无需重新手动启动。通过pm2 startup和pm2 save命令即可实现。
二、PM2安装与基本使用
2.1 安装PM2
# 全局安装PM2
npm install pm2 -g
# 验证安装
pm2 -v
2.2 常用命令速查表
| 命令 | 说明 | 示例 |
|---|---|---|
pm2 start [文件/配置] | 启动服务 | pm2 start app.js |
pm2 stop [进程名/ID] | 停止服务 | pm2 stop my-app |
pm2 restart [进程名/ID] | 重启服务 | pm2 restart my-app |
pm2 delete [进程名/ID] | 删除服务 | pm2 delete my-app |
pm2 list | 查看所有进程状态 | pm2 list |
pm2 logs | 查看日志 | pm2 logs my-app |
pm2 monit | 实时监控 | pm2 monit |
pm2 save | 保存当前进程列表 | pm2 save |
pm2 startup | 设置开机自启 | pm2 startup |
三、Vue3项目中使用PM2的完整指南
3.1 构建Vue3项目
在使用PM2管理Vue3项目之前,首先需要构建项目生成静态文件:
# 进入Vue3项目目录
cd your-vue3-project
# 安装依赖(如果尚未安装)
npm install
# 构建项目
npm run build
构建完成后会生成dist文件夹,其中包含了所有静态资源文件。
3.2 创建PM2配置文件
PM2推荐使用ecosystem.config.js配置文件来管理应用,这种方式更易于维护和版本控制。在项目根目录创建该文件:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-vue3-app', // 应用名称
script: 'serve', // 使用serve启动静态服务器
args: 'dist', // 指定dist目录
exec_mode: 'fork', // 执行模式:fork或cluster
instances: 1, // 实例数量
autorestart: true, // 自动重启
watch: false, // 生产环境关闭监听
max_memory_restart: '1G', // 内存超过1G自动重启
env: {
NODE_ENV: 'development',
PM2_SERVE_PATH: './dist', // 服务路径
PM2_SERVE_PORT: 3000, // 服务端口
PM2_SERVE_SPA: 'true' // 支持SPA路由
},
env_production: {
NODE_ENV: 'production',
PM2_SERVE_PATH: './dist',
PM2_SERVE_PORT: 8080,
PM2_SERVE_SPA: 'true'
},
error_file: './logs/error.log', // 错误日志路径
out_file: './logs/out.log', // 输出日志路径
log_date_format: 'YYYY-MM-DD HH:mm:ss' // 日志时间格式
}]
};
3.3 使用Express服务器方案(备选)
如果你需要更灵活的控制,可以使用Express创建自定义服务器:
// server.js
const express = require('express');
const path = require('path');
const app = express();
// 设置静态文件目录
app.use(express.static(path.join(__dirname, 'dist')));
// 支持SPA路由
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Vue3应用运行在端口 ${PORT}`);
});
然后在PM2配置中使用这个服务器文件:
// ecosystem.config.js
module.exports = {
apps: [{
name: 'vue3-express-app',
script: './server.js',
// ...其他配置
}]
};
3.4 启动Vue3项目
# 使用配置文件启动
pm2 start ecosystem.config.js
# 或者指定生产环境
pm2 start ecosystem.config.js --env production
# 查看运行状态
pm2 status
# 查看实时日志
pm2 logs my-vue3-app
四、高级配置与最佳实践
4.1 集群模式配置
对于高并发场景,可以启用集群模式充分利用多核CPU:
module.exports = {
apps: [{
name: 'vue3-cluster-app',
script: 'serve',
args: 'dist',
instances: 'max', // 根据CPU核心数启动最大实例
exec_mode: 'cluster', // 集群模式
// ...其他配置
}]
};
4.2 环境变量管理
PM2支持多环境配置,便于开发、测试、生产环境的切换:
module.exports = {
apps: [{
name: 'vue3-app',
script: 'serve',
args: 'dist',
env: {
NODE_ENV: 'development',
API_BASE_URL: 'http://localhost:3000/api',
PORT: 3000
},
env_staging: {
NODE_ENV: 'staging',
API_BASE_URL: 'https://staging-api.example.com',
PORT: 8080
},
env_production: {
NODE_ENV: 'production',
API_BASE_URL: 'https://api.example.com',
PORT: 80
}
}]
};
启动时指定环境:
pm2 start ecosystem.config.js --env staging
4.3 日志管理与切割
生产环境中,日志管理至关重要:
# 安装日志切割插件
pm2 install pm2-logrotate
# 配置日志切割
pm2 set pm2-logrotate:max_size 50M # 单个日志文件最大50MB
pm2 set pm2-logrotate:retain 10 # 保留10个日志文件
pm2 set pm2-logrotate:compress true # 压缩旧日志
pm2 set pm2-logrotate:dateFormat 'YYYY-MM-DD_HH-mm-ss' # 日志文件名格式
4.4 开机自启动配置
确保服务器重启后应用自动恢复:
# 生成启动脚本(根据系统提示执行相应命令)
pm2 startup
# 保存当前进程列表
pm2 save
# 重启后自动恢复
pm2 resurrect
4.5 监控与告警
PM2提供了丰富的监控功能:
# 实时监控界面
pm2 monit
# 查看应用详细信息
pm2 show vue3-app
# 生成系统报告
pm2 report
# 以JSON格式查看状态
pm2 jlist
五、Vue3项目部署完整流程
5.1 本地开发环境
# 1. 开发阶段使用Vue CLI
npm run serve
# 2. 构建生产版本
npm run build
# 3. 本地测试构建结果
npx serve dist
5.2 服务器部署流程
# 1. 上传代码到服务器
scp -r dist user@server:/path/to/project/
# 2. 在服务器上安装PM2(如果尚未安装)
npm install pm2 -g
# 3. 上传PM2配置文件
scp ecosystem.config.js user@server:/path/to/project/
# 4. 在服务器上启动应用
cd /path/to/project
pm2 start ecosystem.config.js --env production
# 5. 设置开机自启
pm2 startup
pm2 save
5.3 结合Nginx反向代理
对于生产环境,建议使用Nginx作为反向代理:
# /etc/nginx/sites-available/vue3-app
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000; # PM2运行的端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
# 静态文件缓存
location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
六、常见问题与解决方案
6.1 端口占用问题
如果端口已被占用,PM2会自动尝试其他端口,但最好明确指定:
env: {
PORT: 3000,
PM2_SERVE_PORT: 3000
}
6.2 内存泄漏监控
设置内存限制,超过阈值自动重启:
max_memory_restart: '512M' // 内存超过512MB自动重启
6.3 文件变化监听(开发环境)
开发环境下可以启用文件监听:
watch: true,
ignore_watch: [
'node_modules',
'logs',
'.git'
]
6.4 多应用管理
PM2可以同时管理多个应用:
module.exports = {
apps: [
{
name: 'vue3-frontend',
script: 'serve',
args: 'dist',
// ...前端配置
},
{
name: 'node-backend',
script: './server/api.js',
// ...后端配置
}
]
};
PM2作为Node.js生态中最流行的进程管理工具,为Vue3项目的生产部署提供了完整的解决方案。通过本文的介绍,你应该已经掌握了:
- PM2的核心功能:进程守护、集群模式、日志管理、监控等
- Vue3项目配置:如何通过
ecosystem.config.js文件管理Vue3应用 - 生产环境最佳实践:集群配置、日志切割、开机自启等
- 完整部署流程:从本地开发到服务器部署的全过程
在实际项目中,建议始终使用配置文件而非命令行参数,这样配置更易于维护和版本控制。同时,结合Nginx等Web服务器,可以构建更加稳定和高效的生产环境。
PM2的学习曲线平缓,但功能强大,是每个Node.js和Vue开发者都应该掌握的工具。开始在你的Vue3项目中使用PM2,享受更加稳定和高效的部署体验吧!
提示:本文所有配置示例都经过实际测试,你可以根据项目需求进行调整。更多高级功能请参考PM2官方文档。