PM2是Node.js应用的生产级进程管理器,提供进程守护、自动重启、集群模式、日志管理和性能监控等功能。在搬瓦工VPS上运行Node.js应用时,PM2是必不可少的工具。本文详细介绍PM2的安装配置和常用功能。
# 全局安装
npm install -g pm2
# 验证
pm2 -v
# 安装日志轮转模块
pm2 install pm2-logrotate
# 启动应用
pm2 start app.js
pm2 start app.js --name myapp
pm2 start app.js --name myapp -- --port 3000
# 查看所有进程
pm2 list
pm2 status
# 停止/重启/删除
pm2 stop myapp
pm2 restart myapp
pm2 delete myapp
# 重载(零停机,集群模式下可用)
pm2 reload myapp
# 停止所有
pm2 stop all
# 删除所有
pm2 delete all
通过配置文件管理多个应用,是PM2的推荐使用方式:
pm2 init simple
编辑生成的 ecosystem.config.js:
module.exports = {
apps: [
{
name: 'web-api',
script: 'src/server.js',
cwd: '/var/www/api',
instances: 2,
exec_mode: 'cluster',
env: {
NODE_ENV: 'production',
PORT: 3000
},
max_memory_restart: '300M',
exp_backoff_restart_delay: 100,
watch: false,
ignore_watch: ['node_modules', 'logs'],
error_file: '/var/log/pm2/api-error.log',
out_file: '/var/log/pm2/api-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss Z',
merge_logs: true
},
{
name: 'worker',
script: 'src/worker.js',
cwd: '/var/www/api',
instances: 1,
exec_mode: 'fork',
cron_restart: '0 3 * * *',
env: {
NODE_ENV: 'production'
}
},
{
name: 'frontend',
script: 'node_modules/.bin/next',
args: 'start',
cwd: '/var/www/frontend',
env: {
PORT: 3001
}
}
]
};
# 启动所有应用
pm2 start ecosystem.config.js
# 只启动指定应用
pm2 start ecosystem.config.js --only web-api
# 停止指定应用
pm2 stop ecosystem.config.js --only worker
集群模式利用多CPU核心运行多个应用实例,实现负载均衡:
# 以集群模式启动(自动匹配CPU核心数)
pm2 start app.js -i max
# 指定实例数
pm2 start app.js -i 2
# 扩容/缩容(实时调整实例数)
pm2 scale myapp 4
pm2 scale myapp +2
集群模式支持零停机重载:
# reload会逐个重启实例,保证始终有实例在运行
pm2 reload myapp
# restart会同时重启所有实例(有短暂中断)
pm2 restart myapp
Tip: 搬瓦工VPS通常是1-2核CPU,集群模式实例数建议设为CPU核心数,不宜过多。
# 查看所有应用日志
pm2 logs
# 查看指定应用日志
pm2 logs myapp
# 只看最近50行
pm2 logs myapp --lines 50
# 只看错误日志
pm2 logs myapp --err
# 清空日志
pm2 flush
pm2 flush myapp
配置日志轮转(安装pm2-logrotate后):
# 设置单个日志文件最大大小
pm2 set pm2-logrotate:max_size 10M
# 保留的日志文件数量
pm2 set pm2-logrotate:retain 7
# 压缩旧日志
pm2 set pm2-logrotate:compress true
# 轮转时间间隔
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
# 查看当前配置
pm2 conf pm2-logrotate
# 终端实时监控面板(CPU、内存、日志)
pm2 monit
# 查看详细信息
pm2 show myapp
pm2 describe myapp
# 查看进程指标
pm2 prettylist
# 生成启动脚本(根据系统自动选择systemd/upstart等)
pm2 startup
# 执行命令输出的sudo命令,例如:
# sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.0.0/bin pm2 startup systemd -u user --hp /home/user
# 保存当前进程列表
pm2 save
# 之后每次系统重启,PM2会自动恢复保存的进程
# 取消开机自启
pm2 unstartup
module.exports = {
apps: [{
name: 'myapp',
script: 'app.js',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
},
env_staging: {
NODE_ENV: 'staging',
PORT: 3001
}
}]
};
# 使用production环境启动
pm2 start ecosystem.config.js --env production
# 切换环境需要删除后重新启动
pm2 delete myapp
pm2 start ecosystem.config.js --env staging
# 文件变化时自动重启(开发环境)
pm2 start app.js --watch
# 定时重启(每天凌晨3点)
pm2 start app.js --cron-restart="0 3 * * *"
# 内存超限自动重启
pm2 start app.js --max-memory-restart 300M
# 延迟重启(指数退避)
pm2 start app.js --exp-backoff-restart-delay=100
# 运行npm脚本
pm2 start npm -- start
pm2 start npm --name myapp -- run serve
# 运行Python脚本
pm2 start app.py --interpreter python3
# 导出/导入进程列表
pm2 save
pm2 resurrect
Tip: 更多教程请查看新手教程。