PM2 ist ein Produktions-Prozessmanager für Node.js-Anwendungen. Er bietet automatische Restarts, Clustering, Logging und Zero-Downtime-Deployments.
Features
Übersicht
- Prozess-Management
- Automatischer Neustart bei Crashes
- Cluster-Modus (Multi-Core)
- Zero-Downtime Reload
- Integriertes Logging
- Startup-Skripte
- Monitoring-Dashboard
- Deployment-SystemInstallation
Global
npm install pm2 -gVersion prüfen
pm2 --versionAnwendung starten
Einfacher Start
pm2 start app.jsMit Optionen
pm2 start app.js --name "myapp" --watch --max-memory-restart 200MInterpreter angeben
# Python
pm2 start script.py --interpreter python3
# PHP
pm2 start script.php --interpreter phpCluster-Modus
# Alle CPU-Kerne
pm2 start app.js -i max
# Bestimmte Anzahl
pm2 start app.js -i 4Prozess-Verwaltung
Status anzeigen
pm2 list
pm2 statusProzesse steuern
# Stoppen
pm2 stop app
pm2 stop all
# Neustarten
pm2 restart app
pm2 restart all
# Reload (Zero-Downtime)
pm2 reload app
pm2 reload all
# Löschen
pm2 delete app
pm2 delete allEinzelne Prozesse
# Nach Name
pm2 restart myapp
# Nach ID
pm2 restart 0Ecosystem-Datei
ecosystem.config.js
// ecosystem.config.js
module.exports = {
apps: [
{
name: 'api',
script: './api/server.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '500M',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 8080
}
},
{
name: 'worker',
script: './worker/index.js',
instances: 2,
exec_mode: 'cluster',
cron_restart: '0 0 * * *',
env: {
NODE_ENV: 'production'
}
},
{
name: 'frontend',
script: 'npm',
args: 'start',
cwd: './frontend',
env: {
NODE_ENV: 'production'
}
}
]
};Mit Ecosystem starten
pm2 start ecosystem.config.js
pm2 start ecosystem.config.js --env productionKonfigurationsoptionen
Wichtige Optionen
| Option | Beschreibung | |--------|--------------| | name | Prozess-Name | | script | Skript-Pfad | | instances | Anzahl Instanzen | | exec_mode | fork oder cluster | | watch | Datei-Watcher | | max_memory_restart | Neustart bei RAM-Limit | | cron_restart | Zeitbasierter Restart | | env | Umgebungsvariablen | | log_date_format | Log-Zeitformat | | error_file | Fehler-Log-Pfad | | out_file | Stdout-Log-Pfad | | merge_logs | Logs zusammenführen |
Erweiterte Optionen
{
name: 'app',
script: './app.js',
instances: 4,
exec_mode: 'cluster',
// Restart-Verhalten
max_restarts: 10,
min_uptime: '10s',
restart_delay: 4000,
// Logs
log_date_format: 'YYYY-MM-DD HH:mm:ss',
error_file: '/var/log/pm2/app-error.log',
out_file: '/var/log/pm2/app-out.log',
merge_logs: true,
// Graceful Shutdown
kill_timeout: 5000,
listen_timeout: 8000,
shutdown_with_message: true,
// Source Maps
source_map_support: true,
// Node.js Args
node_args: '--max-old-space-size=4096',
// Watch
watch: ['src'],
ignore_watch: ['node_modules', 'logs'],
watch_delay: 1000
}Logging
Logs anzeigen
# Alle Logs
pm2 logs
# Spezifische App
pm2 logs myapp
# Letzte N Zeilen
pm2 logs --lines 200Log-Management
# Logs rotieren
pm2 install pm2-logrotate
# Logs leeren
pm2 flushLog-Rotation konfigurieren
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ssMonitoring
Terminal-Monitoring
pm2 monitDashboard (PM2 Plus)
pm2 plusMetriken
pm2 show myapp
# CPU/Memory
pm2 info myappStartup-Skript
Systemstart konfigurieren
# Startup-Skript generieren
pm2 startup
# Ausführen (als root)
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u user --hp /home/user
# Aktuelle Prozesse speichern
pm2 saveStartup entfernen
pm2 unstartup systemdZero-Downtime-Deployment
Graceful Reload
// In app.js
process.on('SIGINT', function() {
// Cleanup
server.close(function() {
process.exit(0);
});
// Force close nach Timeout
setTimeout(function() {
process.exit(1);
}, 5000);
});# Reload ohne Downtime
pm2 reload myappDeployment-System
// ecosystem.config.js
module.exports = {
apps: [{
name: 'myapp',
script: './app.js'
}],
deploy: {
production: {
user: 'deploy',
host: 'server.example.de',
ref: 'origin/main',
repo: 'git@github.com:user/repo.git',
path: '/var/www/myapp',
'pre-deploy-local': '',
'post-deploy': 'npm install && pm2 reload ecosystem.config.js --env production',
'pre-setup': ''
}
}
};# Erstes Deployment
pm2 deploy production setup
# Deployment
pm2 deploy productionUmgebungsvariablen
In Ecosystem
{
env: {
NODE_ENV: 'development',
API_KEY: 'dev-key'
},
env_production: {
NODE_ENV: 'production',
API_KEY: 'prod-key'
},
env_staging: {
NODE_ENV: 'staging',
API_KEY: 'staging-key'
}
}Starten mit Environment
pm2 start ecosystem.config.js --env productionEnv zur Laufzeit ändern
pm2 restart myapp --update-envCluster-Modus
Skalierung
# Auf 4 Instanzen skalieren
pm2 scale myapp 4
# 2 Instanzen hinzufügen
pm2 scale myapp +2
# 1 Instanz entfernen
pm2 scale myapp -1Load Balancing
// PM2 verteilt automatisch (Round-Robin)
{
instances: 'max', // Alle CPUs
exec_mode: 'cluster'
}Docker-Integration
Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm install pm2 -g
EXPOSE 3000
CMD ["pm2-runtime", "ecosystem.config.js"]pm2-runtime
# Für Container (kein Daemon)
pm2-runtime ecosystem.config.jsTroubleshooting
Probleme debuggen
# Detaillierte Infos
pm2 show myapp
# Logs prüfen
pm2 logs myapp --err
# Prozess beschreiben
pm2 describe myappHäufige Probleme
# Prozess startet nicht
# → Pfade prüfen
# → Berechtigungen prüfen
# → node_modules prüfen
# Hoher Memory
pm2 restart myapp --max-memory-restart 500M
# Prozess-Dump löschen
pm2 kill
pm2 resurrect # oder pm2 start ...Zusammenfassung
| Befehl | Funktion | |--------|----------| | pm2 start | Prozess starten | | pm2 stop | Prozess stoppen | | pm2 restart | Neustart | | pm2 reload | Zero-Downtime Reload | | pm2 delete | Prozess löschen | | pm2 logs | Logs anzeigen | | pm2 monit | Monitoring | | pm2 save | Prozesse speichern |
| Datei | Funktion | |-------|----------| | ecosystem.config.js | App-Konfiguration | | ~/.pm2/ | PM2-Daten |
| Modus | Verwendung | |-------|------------| | fork | Single-Prozess | | cluster | Multi-Core |
Fazit
PM2 ist der Standard-Prozessmanager für Node.js in Produktion. Der Cluster-Modus nutzt alle CPU-Kerne. Automatische Restarts erhöhen die Verfügbarkeit. Das Deployment-System vereinfacht Rollouts. Zero-Downtime-Reloads sind für Production-Anwendungen essentiell. Mit PM2 Plus gibt es optional ein Cloud-basiertes Dashboard.