Node.js tek thread''de çalışır; tek process ile tek CPU çekirdeğinden faydalanabilirsiniz. 8 çekirdekli bir sunucuda kaynağın %87''si kullanılmadan kalır. Cluster mode ve PM2 ile hem tüm çekirdekleri kullanır hem de zero-downtime deploy yaparsınız. Bu rehber üretim kurulumunun her adımını anlatır.
Cluster Mode Nedir?
İlgili rehberler: Yazılım geliştirme süreçleri · PostgreSQL optimizasyonu · Git ileri seviye komutlar · Redis nedir, nasıl kullanılır · Docker ile deploy
Node.js''in cluster modülü master process altında birden fazla worker açar. Worker''lar aynı port''u paylaşır; OS kernel gelen bağlantıları worker''lar arasında dağıtır. 8 core sunucu = 8 worker = ~8x throughput.
PM2 Kurulumu ve Temel Kullanım
# Global kurulum
npm i -g pm2
# Tek komutla cluster başlat
pm2 start server.js -i max --name myapp
# -i max = tüm core''larda worker
# Durum
pm2 list
pm2 monit # canlı dashboard
pm2 logs myapp --lines 100
pm2 describe myapp
# Yönetim
pm2 restart myapp
pm2 reload myapp # zero-downtime — worker''ları tek tek yenile
pm2 stop myapp
pm2 delete myapp
ecosystem.config.js
Production için inline komut yerine config dosyası kullanın. Tüm ayarlar version control''de.
// ecosystem.config.js
module.exports = {
apps: [{
name: 'keydal',
script: './server.js',
instances: 'max', // tüm çekirdekler
exec_mode: 'cluster',
// Memory limit aşılırsa restart
max_memory_restart: '512M',
// Env
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
// Log
out_file: '/var/log/keydal/out.log',
error_file: '/var/log/keydal/error.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
merge_logs: true,
// Restart davranışı
autorestart: true,
watch: false,
max_restarts: 10,
min_uptime: '10s',
// Graceful shutdown
kill_timeout: 5000,
listen_timeout: 3000,
wait_ready: true
}]
};
# Production başlat
pm2 start ecosystem.config.js --env production
# Boot''ta otomatik başlat
pm2 startup
pm2 save
Zero-Downtime Deploy
pm2 reload: worker''lar tek tek sırayla yenilenir. Yeni worker hazır olunca eskisi kill edilir; kullanıcı kesinti hissetmez. restart''tan farklı — o tüm worker''ları aynı anda keser.
// server.js — graceful shutdown için
const server = app.listen(PORT, () => {
console.log(`Server started on ${PORT}`);
if (process.send) process.send('ready'); // PM2'ye hazır sinyali
});
process.on('SIGINT', gracefulShutdown);
process.on('SIGTERM', gracefulShutdown);
function gracefulShutdown() {
console.log('Shutting down gracefully...');
server.close(() => {
console.log('HTTP server closed');
db.pool.end(() => process.exit(0));
});
// Zorla 10 saniye sonra çık
setTimeout(() => process.exit(1), 10000);
}
wait_ready: true + process.send(''ready'') kombinasyonu PM2''ye worker''ın tamamen hazır olduğunu bildirir. Bu sinyal gelmeden eskisi kill edilmez.Log Yönetimi
# Log rotation ekle (aksi halde log dosyaları şişer)
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'
Monitoring
pm2 monit— lokal dashboard- PM2 Plus — cloud dashboard, ücretsiz plan var
- Prometheus export —
pm2-prom-module - OpenTelemetry — Datadog, New Relic entegrasyonu
Memory Leak Tespiti
# Heap snapshot al
pm2 restart myapp --node-args='--inspect'
# Chrome DevTools → chrome://inspect → Memory tab
# veya clinic
npm i -g clinic
clinic doctor -- node server.js
# 30 saniye trafik ver, sonra Ctrl+C
# tarayıcıda HTML raporu açılır
Cluster vs Docker/Kubernetes
Kubernetes ortamında PM2 cluster mode genellikle gereksizdir — K8s her pod''u tek process olarak çalıştırıp horizontal pod autoscaler ile ölçekler. PM2 cluster, tek VPS/dedicated sunucuda anlamlıdır.
fork mode ile tek worker yap, ölçeklemeyi K8s''e bırak. Cluster mode memory''de 2 kat fazla yer kaplar.Deploy Workflow
# Tipik deploy script
#!/bin/bash
set -e
BRANCH=${1:-main}
cd /var/www/myapp
git fetch origin
git checkout $BRANCH
git pull origin $BRANCH
npm ci --production
npm run build # varsa
pm2 reload ecosystem.config.js --env production
pm2 save
echo "Deploy done."
Modern Yazılım Geliştirme ve DevOps Pratikleri
Profesyonel yazılım geliştirme süreci üç pillar üzerine kuruludur: kaynak kontrolü (Git + GitHub/GitLab pull request akışı, code review zorunlu), CI/CD pipeline (otomatik test + lint + build + deploy), ve gözlemlenebilirlik (Sentry/Datadog/Grafana ile log, metric, trace toplama). Test piramidi (unit > integration > e2e) ile kod kalitesini garantilemek, mikroservis mimarisinde Docker container ve Kubernetes orkestrasyonu kullanmak, REST veya GraphQL API tasarımında OpenAPI/GraphQL Schema sözleşmesi tutmak modern standardlardır. Yazılım geliştirme yaşam döngüsü boyunca (gereksinim → tasarım → implementasyon → test → deploy → bakım) Agile/Scrum sprintleri 1-2 hafta, DevOps takımları sürekli teslim (continuous delivery) prensibiyle çalışır.
PM2, Docker ve Kubernetes ortamlarında Node.js production kurulumu için iletişime geçin