PM2 Node Process Manager
PM2: Node.js Prozesse in Produktion verwalten
Node.js direkt mit node starten ist für Produktion nicht geeignet. PM2 hält Ihre App am Leben, startet bei Crashes neu und nutzt alle CPU-Kerne.
Installation
# Global installieren npm install -g pm2 # Version prüfen pm2 --version
Grundlegende Befehle
# App starten pm2 start app.js # Mit Namen pm2 start app.js --name "my-api" # Alle Prozesse anzeigen pm2 list pm2 ls pm2 status # Logs anzeigen pm2 logs pm2 logs my-api pm2 logs --lines 100 # Prozess stoppen pm2 stop my-api pm2 stop all # Prozess neustarten pm2 restart my-api pm2 restart all # Prozess löschen pm2 delete my-api pm2 delete all # Monitoring pm2 monit
Cluster Mode
Nutzt alle CPU-Kerne für maximale Performance:
# Alle Kerne nutzen pm2 start app.js -i max # Bestimmte Anzahl pm2 start app.js -i 4 # Cluster skalieren pm2 scale my-api +2 # 2 weitere pm2 scale my-api 6 # Auf 6 setzen
Ecosystem File (empfohlen)
# ecosystem.config.js generieren pm2 init # Oder pm2 ecosystem
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-api',
script: 'src/index.js',
instances: 'max',
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
}
}, {
name: 'worker',
script: 'src/worker.js',
instances: 2,
exec_mode: 'cluster'
}]
};
# Mit Ecosystem-File starten pm2 start ecosystem.config.js # Produktion pm2 start ecosystem.config.js --env production
Auto-Start bei Server-Reboot
# Startup Script generieren pm2 startup # Aktuellen Zustand speichern pm2 save # Bei Systemstart werden alle gespeicherten Apps gestartet # Startup entfernen pm2 unstartup
Zero-Downtime Reload
# Graceful Reload (kein Downtime) pm2 reload my-api pm2 reload all # Normaler Restart (kurzer Downtime) pm2 restart my-api
Graceful Shutdown in App
// In Ihrer App
process.on('SIGINT', () => {
console.log('Shutting down gracefully...');
server.close(() => {
console.log('Server closed');
// Datenbankverbindung schließen etc.
process.exit(0);
});
// Force close nach 10s
setTimeout(() => {
process.exit(1);
}, 10000);
});
Deployment
// ecosystem.config.js
module.exports = {
apps: [{
name: 'my-api',
script: 'src/index.js'
}],
deploy: {
production: {
user: 'deploy',
host: 'server.example.com',
ref: 'origin/main',
repo: 'git@github.com:user/repo.git',
path: '/var/www/my-api',
'pre-deploy-local': '',
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',
'pre-setup': ''
}
}
};
# Erstmaliges Setup pm2 deploy production setup # Deployment pm2 deploy production # Rollback pm2 deploy production revert 1
Nützliche Optionen
| Option | Beschreibung |
|---|---|
--name |
Prozessname |
-i max |
Cluster mit max CPUs |
--watch |
Bei Änderungen neustarten |
--max-memory-restart |
Restart bei Memory-Limit |
--cron |
Geplante Restarts |
--no-autorestart |
Kein Auto-Restart |
Log Management
# Logs anzeigen pm2 logs pm2 logs my-api --lines 200 # Logs leeren pm2 flush # Log-Dateien ls ~/.pm2/logs/
Log Rotation
# pm2-logrotate installieren pm2 install pm2-logrotate # Konfigurieren pm2 set pm2-logrotate:max_size 10M pm2 set pm2-logrotate:retain 7 pm2 set pm2-logrotate:compress true
Monitoring
# Terminal-Monitor pm2 monit # Web Dashboard (pm2.io) pm2 plus # Status als JSON pm2 jlist pm2 prettylist
Typische Ecosystem-Config
module.exports = {
apps: [{
name: 'api',
script: 'dist/index.js',
instances: 'max',
exec_mode: 'cluster',
autorestart: true,
watch: false,
max_memory_restart: '500M',
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',
env: {
NODE_ENV: 'production',
PORT: 3000
}
}]
};
💡 Tipp:
Kombinieren Sie PM2 mit dem Enjyn Server Monitor für externes Monitoring und Benachrichtigungen bei Ausfällen.