主题模式
Node.js项目PM2部署详解
PM2 是一个先进的 Node.js 进程管理器,它内置负载均衡器,可以帮助我们在生产环境中管理和保持应用程序的运行。本文将详细介绍 PM2 的安装、配置以及如何使用 PM2 来部署 Node.js 应用程序。
1. PM2简介
PM2 是一个带有内置负载均衡器的 Node.js 应用进程管理器。它允许你永远保持应用程序的活跃状态,无需停机即可重新加载它们,并简化常见的系统管理任务。
1.1 PM2的主要特性
- 内建负载均衡器(通过 Node cluster 集群)
- 后台运行 Node.js 应用程序
- 0 秒停机重载应用
- 方便的进程监控
- 支持系统日志
- 可以配合 Docker 使用
- 支持多种环境配置
2. PM2安装
2.1 前提条件
确保你的服务器上已经安装了 Node.js 和 npm:
bash
# 检查 Node.js 版本
node -v
# 检查 npm 版本
npm -v2.2 全局安装PM2
bash
# 使用 npm 全局安装 PM2
npm install -g pm2
# 或者使用 yarn 安装
yarn global add pm22.3 验证安装
bash
# 检查 PM2 版本
pm2 -v
# 显示 PM2 帮助信息
pm2 --help3. PM2基本使用
3.1 启动应用
bash
# 启动应用并命名为 my-app
pm2 start app.js --name my-app
# 启动应用并指定多个实例(集群模式)
pm2 start app.js -i max --name my-app-cluster
# 启动应用并监听文件变化自动重启
pm2 start app.js --watch --name my-app-watch
# 启动应用并指定端口
pm2 start app.js --name my-app -- --port 30003.2 管理应用
bash
# 列出所有运行的应用
pm2 list
# 停止指定应用
pm2 stop my-app
# 重启指定应用
pm2 restart my-app
# 删除指定应用
pm2 delete my-app
# 停止所有应用
pm2 stop all
# 重启所有应用
pm2 restart all
# 删除所有应用
pm2 delete all3.3 监控应用
bash
# 实时监控应用状态
pm2 monit
# 显示应用详细信息
pm2 show my-app
# 查看应用日志
pm2 logs my-app
# 查看所有应用日志
pm2 logs4. PM2配置文件
PM2 支持通过配置文件来管理应用,这样可以更好地组织复杂的部署设置。
4.1 创建ecosystem.config.js文件
javascript
module.exports = {
apps : [{
name: 'my-node-app',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
}
}],
deploy : {
production : {
user : 'SSH_USERNAME',
host : ['SERVER_IP'],
ref : 'origin/master',
repo : 'GIT_REPOSITORY',
path : 'DESTINATION_PATH',
'pre-deploy-local': '',
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production',
'pre-setup': ''
}
}
};4.2 使用配置文件启动应用
bash
# 启动配置文件中的所有应用
pm2 start ecosystem.config.js
# 启动生产环境配置
pm2 start ecosystem.config.js --env production
# 重启应用
pm2 reload ecosystem.config.js
# 停止应用
pm2 stop ecosystem.config.js
# 删除应用
pm2 delete ecosystem.config.js5. PM2高级功能
5.1 日志管理
bash
# 查看实时日志
pm2 logs
# 查看特定应用的日志
pm2 logs my-app
# 清空日志
pm2 flush
# 重载日志
pm2 reloadLogs
# 配置日志文件路径
pm2 start app.js --log /var/log/pm2/app.log5.2 内存监控和重启
bash
# 当内存超过100MB时重启应用
pm2 start app.js --max-memory-restart 100M
# 在配置文件中设置内存限制
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
max_memory_restart: '100M'
}]
};5.3 自动重启策略
javascript
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
autorestart: true,
max_restarts: 10,
min_uptime: '5s',
restart_delay: 3000
}]
};6. PM2与系统集成
6.1 设置开机自启
bash
# 保存当前应用列表
pm2 save
# 设置PM2开机自启
pm2 startup
# 取消开机自启
pm2 unstartup6.2 导出和导入应用列表
bash
# 导出当前应用列表
pm2 save
# 导入应用列表
pm2 resurrect7. 生产环境部署最佳实践
7.1 环境变量管理
javascript
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
env: {
NODE_ENV: 'development',
DB_HOST: 'localhost',
DB_PORT: 27017
},
env_production: {
NODE_ENV: 'production',
DB_HOST: 'prod-db-server',
DB_PORT: 27017
}
}]
};7.2 使用PM2进行负载均衡
javascript
// 集群模式启动
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
instances: 'max', // 根据CPU核心数启动实例
exec_mode: 'cluster',
max_memory_restart: '1G'
}]
};7.3 健康检查
javascript
// 在应用中添加健康检查端点
const express = require('express');
const app = express();
app.get('/health', (req, res) => {
res.status(200).json({ status: 'OK', timestamp: new Date() });
});
// PM2配置中启用就绪检查
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
wait_ready: true,
listen_timeout: 5000,
kill_timeout: 3000
}]
};8. 故障排除
8.1 常见问题
应用启动失败
bash# 查看详细错误信息 pm2 logs my-app --lines 100内存泄漏
bash# 设置内存限制自动重启 pm2 start app.js --max-memory-restart 500M端口占用
bash# 查看端口使用情况 lsof -i :3000 # 杀掉占用端口的进程 kill -9 PID
8.2 性能优化
javascript
// 生产环境优化配置
module.exports = {
apps: [{
name: 'my-app',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
max_memory_restart: '1G',
node_args: '--max-old-space-size=4096',
env: {
NODE_ENV: 'production'
}
}]
};9. 安全考虑
9.1 用户权限
bash
# 不要以root用户运行PM2
# 创建专门的应用用户
sudo adduser appuser
sudo su - appuser
pm2 start app.js9.2 网络安全
javascript
// 限制Node.js应用仅监听本地接口
app.listen(PORT, '127.0.0.1', () => {
console.log(`App listening on port ${PORT}`);
});10. 监控和维护
10.1 使用PM2 Web界面
bash
# 启动PM2 Web监控界面
pm2 web
# 默认访问地址:http://localhost:961510.2 定期维护
bash
# 更新PM2到最新版本
npm install -g pm2
# 更新PM2运行时
pm2 update总结
PM2 是部署 Node.js 应用的强大工具,它不仅提供了进程管理功能,还具备负载均衡、日志管理、监控等多种特性。通过合理配置 PM2,我们可以确保 Node.js 应用在生产环境中的稳定运行。
在实际部署过程中,建议结合具体的业务需求和服务器环境,制定合适的 PM2 配置方案,并定期监控应用的运行状态,及时发现和解决问题。