进程管理:PM2 与 systemd
前言
直接用 node app.js 运行应用存在致命问题:进程崩溃不会自动重启、终端关闭进程就停止、无法利用多核 CPU。PM2 是 Node.js 的生产级进程管理器,而 systemd 是 Linux 的系统服务管理器。本文将带你掌握这两种方案。
正文
一、PM2
npm install -g pm2
1.1 基本命令
# 启动应用
pm2 start src/server.js --name my-api
# 集群模式(利用多核 CPU)
pm2 start src/server.js --name my-api -i max # max = CPU 核心数
pm2 start src/server.js --name my-api -i 4 # 4 个实例
# 查看状态
pm2 status # 列表
pm2 monit # 实时监控面板
# 日志
pm2 logs # 所有应用日志
pm2 logs my-api # 特定应用
pm2 logs --lines 100 # 最近100行
# 重启/停止/删除
pm2 restart my-api
pm2 reload my-api # 零停机重启(集群模式)
pm2 stop my-api
pm2 delete my-api
# 重启所有
pm2 restart all
# 保存当前进程列表(开机自启用)
pm2 save
pm2 startup # 生成开机启动脚本
1.2 Ecosystem 配置文件
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-api',
script: 'src/server.js',
instances: 'max', // 集群模式
exec_mode: 'cluster',
watch: false, // 生产环境关闭
max_memory_restart: '500M', // 内存超限自动重启
env: {
NODE_ENV: 'production',
PORT: 3000
},
env_development: {
NODE_ENV: 'development',
PORT: 3000
},
// 日志配置
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: './logs/pm2-error.log',
out_file: './logs/pm2-out.log',
merge_logs: true,
// 自动重启策略
exp_backoff_restart_delay: 100, // 指数退避重启
max_restarts: 10,
min_uptime: '10s'
}]
};
# 使用配置文件启动
pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env development
# 部署相关
pm2 deploy ecosystem.config.js production
1.3 PM2 监控
# 内置监控
pm2 monit
# 查看详细信息
pm2 show my-api
# 重要指标:
# - 重启次数(频繁重启说明有 bug)
# - 内存使用
# - CPU 使用
# - 运行时间(uptime)
二、systemd
systemd 是 Linux 原生的服务管理器,适合管理任何类型的后台服务。
2.1 创建服务单元
# /etc/systemd/system/my-api.service
[Unit]
Description=My Node.js API
After=network.target postgresql.service redis.service
[Service]
Type=simple
User=deploy
Group=deploy
WorkingDirectory=/var/www/my-api
ExecStart=/usr/bin/node src/server.js
Restart=on-failure
RestartSec=5
StandardOutput=journal
StandardError=journal
# 环境变量
Environment=NODE_ENV=production
Environment=PORT=3000
EnvironmentFile=/var/www/my-api/.env
# 安全限制
NoNewPrivileges=true
ProtectSystem=strict
ReadWritePaths=/var/www/my-api/logs /var/www/my-api/uploads
[Install]
WantedBy=multi-user.target
2.2 管理服务
# 重载配置
sudo systemctl daemon-reload
# 启动/停止/重启
sudo systemctl start my-api
sudo systemctl stop my-api
sudo systemctl restart my-api
# 开机自启
sudo systemctl enable my-api
sudo systemctl disable my-api
# 查看状态
sudo systemctl status my-api
# 查看日志
sudo journalctl -u my-api -f # 实时跟踪
sudo journalctl -u my-api --since today
sudo journalctl -u my-api -n 100 # 最近100行
三、PM2 vs systemd
| 维度 | PM2 | systemd |
|---|---|---|
| 集群模式 | ✅ 内置 | ❌ 需要手动配置 |
| 日志管理 | ✅ 内置 | ✅ journalctl |
| 零停机重启 | ✅ pm2 reload | ❌ 需要额外配置 |
| 监控面板 | ✅ pm2 monit | ❌ 需要第三方工具 |
| 系统集成 | 需要 pm2 startup | ✅ 原生 |
| 适用范围 | Node.js 专用 | 任何服务 |
推荐:大多数 Node.js 项目使用 PM2。如果在容器(Docker)中运行,则不需要 PM2,直接用
node命令即可。
四、生产环境部署流程
# 1. SSH 登录服务器
ssh prod
# 2. 拉取最新代码
cd /var/www/my-api
git pull origin main
# 3. 安装依赖
npm ci --production
# 4. 数据库迁移
npx prisma migrate deploy
# 5. 零停机重启
pm2 reload my-api
# 6. 检查状态
pm2 status
pm2 logs my-api --lines 20
总结
| 概念 | 要点 |
|---|---|
| PM2 | Node.js 生产级进程管理器 |
| 集群模式 | -i max 利用多核 CPU |
| 零停机重启 | pm2 reload(集群模式下) |
| ecosystem | 配置文件管理环境变量和启动参数 |
| systemd | Linux 原生服务管理器 |
| 开机自启 | pm2 startup 或 systemctl enable |
下一篇:0115-环境变量与配置管理