@Linux进程管理工具 - PM2全面指南
文章目录
- PM2 进程管理
- 1. PM2 简介
- 主要特性
- 2. 安装 PM2
- 前提条件
- 全局安装
- 验证安装
- 3. 基本使用
- 启动应用
- 常用命令
- 集群模式
- 4. 高级配置
- 生态系统文件
- 常用配置选项
- 5. 日志管理
- 查看日志
- 日志配置
- 日志轮转
- 6. 监控与性能
- 实时监控
- 生成性能报告
- Web 仪表板
- 7. 开机自启动
- 生成启动脚本
- 保存当前进程列表
- 恢复保存的列表
- 8. 部署工作流
- 部署配置
- 部署命令
- 9. 常用技巧
- 环境变量管理
- 使用 JSON 应用声明
- 远程管理
- 10. 故障排除
- 常见问题
- 调试命令
- 11. 安全最佳实践
- 12. 与其他工具集成
- 与 Nginx 集成
- 与 Docker 集成
- 与 CI/CD 集成
- 13. 资源与参考
PM2 进程管理
1. PM2 简介
PM2 (Process Manager 2) 是一个先进的、生产级的 Node.js 应用进程管理器,具有负载均衡功能。它允许您保持应用程序永久活跃,无需停机即可重新加载它们,并简化常见的系统管理任务。
主要特性
- 进程守护:保持应用程序始终运行,崩溃后自动重启
- 负载均衡:内置负载均衡器,可轻松实现集群模式
- 零停机重启:支持热重载,更新代码时不中断服务
- 日志管理:集中收集和管理应用程序日志
- 监控:实时监控应用程序资源消耗
- 启动脚本:生成系统启动脚本,保证服务器重启后应用自动运行
- 生态系统:支持多应用管理,可配置复杂部署方案
2. 安装 PM2
前提条件
- Node.js 环境 (推荐 LTS 版本)
- npm 或 yarn 包管理器
全局安装
npm install pm2 -g
# 或
yarn global add pm2
验证安装
pm2 --version
3. 基本使用
启动应用
pm2 start app.js
# 或指定应用名称
pm2 start app.js --name "my-app"
常用命令
命令 | 描述 |
---|---|
pm2 start app.js | 启动应用 |
pm2 list | 列出所有应用 |
`pm2 show <id | name>` |
`pm2 stop <id | name>` |
`pm2 restart <id | name>` |
`pm2 delete <id | name>` |
pm2 logs | 显示日志 |
pm2 monit | 监控应用 |
pm2 flush | 清空日志 |
集群模式
启动集群(利用所有CPU核心):
pm2 start app.js -i max
4. 高级配置
生态系统文件
创建配置文件:
pm2 ecosystem
这会生成一个 ecosystem.config.js
文件,示例内容:
module.exports = {apps: [{name: "app",script: "./app.js",instances: "max",autorestart: true,watch: false,max_memory_restart: "1G",env: {NODE_ENV: "development",},env_production: {NODE_ENV: "production",}}]
};
使用配置文件:
pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env production
常用配置选项
选项 | 描述 |
---|---|
name | 应用名称 |
script | 启动脚本路径 |
args | 传递给脚本的参数 |
interpreter | 解释器 (如 node, python 等) |
instances | 实例数 (数字或 “max”) |
exec_mode | 执行模式 (“cluster” 或 “fork”) |
watch | 是否监听文件变化自动重启 |
ignore_watch | 忽略监听的文件/目录 |
max_memory_restart | 内存超过限制时重启 |
env | 环境变量 |
log_date_format | 日志日期格式 |
error_file | 错误日志路径 |
out_file | 输出日志路径 |
merge_logs | 是否合并日志 |
cron_restart | 定时重启 |
5. 日志管理
查看日志
# 查看所有应用日志
pm2 logs# 查看特定应用日志
pm2 logs <app-name># 查看最后100行日志
pm2 logs --lines 100# 实时日志
pm2 logs --real-time
日志配置
在生态系统文件中:
{...log_date_format: "YYYY-MM-DD HH:mm Z",error_file: "/var/log/my-app/err.log",out_file: "/var/log/my-app/out.log",combine_logs: true,...
}
日志轮转
PM2 内置了日志轮转功能,需要安装 pm2-logrotate
模块:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
6. 监控与性能
实时监控
pm2 monit
生成性能报告
pm2 report
Web 仪表板
pm2 plus
(需要注册 PM2 Plus 账户)
7. 开机自启动
生成启动脚本
pm2 startup
这会输出一个命令,按照提示执行即可。
保存当前进程列表
pm2 save
恢复保存的列表
pm2 resurrect
8. 部署工作流
PM2 支持高级部署功能,可以在多服务器上部署应用。
部署配置
在生态系统文件中添加 deploy
部分:
module.exports = {apps: [...],deploy: {production: {user: "node",host: ["server1.com", "server2.com"],ref: "origin/master",repo: "git@github.com:user/repo.git",path: "/var/www/production","post-deploy": "npm install && pm2 reload ecosystem.config.js --env production",env: {NODE_ENV: "production"}}}
}
部署命令
# 首次部署
pm2 deploy ecosystem.config.js production setup# 后续部署
pm2 deploy ecosystem.config.js production# 回滚到上一个版本
pm2 deploy ecosystem.config.js production revert 1
9. 常用技巧
环境变量管理
# 设置环境变量
pm2 set pm2:env {"NODE_ENV":"production","PORT":3000}# 获取环境变量
pm2 env <app-id>
使用 JSON 应用声明
pm2 start app.json
示例 app.json
:
{"name": "my-app","script": "app.js","instances": 2,"env": {"NODE_ENV": "development"},"env_production": {"NODE_ENV": "production"}
}
远程管理
# 连接到远程 PM2
pm2 interact <public_key> <secret_key> <machine_name># 断开连接
pm2 interact stop
10. 故障排除
常见问题
-
应用不断重启
- 检查内存限制 (
max_memory_restart
) - 检查应用错误日志
- 尝试
pm2 logs <app-id>
查看详细错误
- 检查内存限制 (
-
PM2 命令无响应
- 尝试
pm2 kill
然后重新启动应用 - 检查
~/.pm2/pm2.log
获取 PM2 自身日志
- 尝试
-
启动脚本不工作
- 确保正确执行了
pm2 startup
和pm2 save
- 检查系统服务是否正常运行 (
systemctl status pm2-<user>
)
- 确保正确执行了
调试命令
# 显示 PM2 守护进程日志
pm2 l# 显示详细调试信息
pm2 --version --details# 重置所有 PM2 状态
pm2 kill
11. 安全最佳实践
-
不要使用 root 运行 PM2
sudo chown -R $USER:$USER ~/.pm2
-
保护生态系统文件
- 不要将敏感信息(如密码)直接写入配置文件
- 使用环境变量或密钥管理工具
-
限制日志访问权限
chmod 600 /var/log/my-app/*.log
-
定期更新 PM2
npm update pm2 -g
12. 与其他工具集成
与 Nginx 集成
示例 Nginx 配置:
server {listen 80;server_name example.com;location / {proxy_pass http://localhost:3000;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;}
}
与 Docker 集成
示例 Dockerfile:
FROM node:14WORKDIR /usr/src/appCOPY package*.json ./RUN npm installCOPY . .RUN npm install pm2 -gCMD ["pm2-runtime", "ecosystem.config.js", "--env", "production"]
与 CI/CD 集成
示例 GitHub Actions 工作流:
name: Node.js CIon: [push]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Use Node.jsuses: actions/setup-node@v1with:node-version: '14.x'- run: npm install- run: npm test- name: Deploy to productionif: github.ref == 'refs/heads/master'run: |ssh user@server "cd /var/www/production && git pull && pm2 reload ecosystem.config.js --env production"
13. 资源与参考
- PM2 官方文档
- PM2 GitHub 仓库
- Node.js 最佳实践
通过本指南,您应该能够全面了解 PM2 的功能并有效地在生产环境中部署和管理 Node.js 应用。PM2 的强大功能可以显著提高应用的可靠性和可维护性,是 Node.js 开发者必备的工具之一。