Veloris.
返回索引
概念基础 2026-03-08

进程管理:PM2 与 systemd

2 分钟
349 words

进程管理: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

维度PM2systemd
集群模式✅ 内置❌ 需要手动配置
日志管理✅ 内置✅ 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

总结

概念要点
PM2Node.js 生产级进程管理器
集群模式-i max 利用多核 CPU
零停机重启pm2 reload(集群模式下)
ecosystem配置文件管理环境变量和启动参数
systemdLinux 原生服务管理器
开机自启pm2 startupsystemctl enable

下一篇0115-环境变量与配置管理

参考资料

End of file.