Buyukweb
PM2 ile Node.js Üretim Ortamı: Cluster, Log, Reload Rehberi

PM2 ile Node.js Üretim Ortamı: Cluster, Log, Reload Rehberi

PM2 ile Node.js uygulamasını üretim ortamında yönetme rehberi: cluster mode, ecosystem.config.js, zero-downtime reload, log rotation, Nginx reverse proxy ve Buyukweb VDS üzerinde PM2 + systemd entegrasyonu.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

PM2 ile Node.js Üretim Ortamı: Cluster, Log, Reload Rehberi

Şu an okuduğunuz buyukweb.com sayfasının arkasında çalışan Node.js süreçlerini de PM2 yönetiyor — Next.js + @prisma/client + cPanel kombosu, Bursa Tier 3 veri merkezimizde pm2 reload ile sıfır kesintili yayına alınıyor. Bu rehber kitap-bilgisi değil, kendi prodüksiyon stack'imizden çıkmış pratik notlar.

node app.js ile uygulama çalıştırmak prod için yetersiz: process kapanırsa kullanıcı 502 görür; multi-core CPU'nun 7 vCPU'su boş dururken tek thread'de tıkanırsanız throughput düşer; deploy'da Ctrl+C ile eskiyi kapatıp yeniyi açtığınızda 8-15 saniye downtime. PM2 (Process Manager 2) bu üç noktayı tek araçla çözüyor. Bu yazıda PM2'yi systemd ile birlikte koşan bir process manager olarak ele alacağız: kurulum, ecosystem.config.js, cluster mode, log rotation, max_memory_restart, Nginx reverse proxy ve VDS'te pm2 startup + pm2 save ile boot-resilient kurulum.

Buyukweb perspektifi: E5 v4 VDS gibi unmanaged VDS paketlerinde Node.js LTS + PM2 + Nginx + Let's Encrypt kombosu tam kontrolünüzde — bu yazının asıl kapsamı budur. cPanel Web Hosting paketlerinde Node.js Selector eklentisi basit Node.js uygulaması için dokunulmadan çalışır; cluster mode, custom port veya PM2 dashboard kontrolü istiyorsanız VDS doğru seçim.

Neden Process Manager? PM2 vs systemd vs Docker

Process manager seçimi ekibinize göre değişir; "PM2 = en iyi" demek doğru değil:

Yaklaşım Güçlü Tarafı Zayıf Tarafı Senaryo
node app.js Sıfır bağımlılık Crash/cluster/log yok Sadece dev
nodemon File-watch auto-restart Sadece dev için Geliştirme — prod ASLA
PM2 Cluster, ecosystem, log, monit built-in JS-only, 3rd party Modern Node.js prod — odak
systemd (saf) Linux native, OS-level Cluster yok, Node-aware değil Tek-instance servis
Docker + compose Containerized, multi-language Image build pipeline Mikroservis, container kültürü
Kubernetes Auto-scale, multi-node Operasyon yükü ağır Yüksek ölçek, çoklu sunucu

PM2 pratik kazançları: crash recovery, cluster mode + round-robin, zero-downtime pm2 reload, log aggregation, pm2 monit ve ecosystem.config.js tek-dosya konfigürasyon.

Tercih etmeyin: PM2'yi systemd alternatifi görmeyi. pm2 startup komutu systemd unit'i oluşturur, PM2 daemon'ı systemd başlatır. İki katman: systemd → pm2-<user> daemon → uygulamalarınız.

Kurulum: Node.js LTS + PM2 (Buyukweb VDS)

Ubuntu 22.04 / 24.04 veya AlmaLinux 9'da Node.js 20 veya 22 LTS önerilir (2026 itibarıyla 22 stable). nvm ile sürüm yönetimi pratik:

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 22 && nvm use 22
node -v   # v22.x.x

npm install -g pm2

nvm'i sudo ile kurmayın. PM2'yi aynı user altında -g ile kurun; PM2 daemon o user'ın ~/.pm2/ dizininde state tutar.

Temel Komutlar — Günlük Kullanım

# Başlat
pm2 start app.js --name "uygulama"
pm2 start npm --name "uygulama" -- start            # package.json -> "start"
pm2 start ecosystem.config.js --env production      # önerilen yol

# Listele / log / monit
pm2 list                                # tüm uygulamalar
pm2 show uygulama                       # PID, RAM, restart sayısı, log path
pm2 logs uygulama --lines 200 --err     # son 200 satır stderr
pm2 flush                               # disk dolduğunda temizle
pm2 monit                               # interaktif TUI

# Restart / reload / stop / delete
pm2 restart uygulama    # hard restart (1-3sn downtime)
pm2 reload uygulama     # graceful zero-downtime (cluster mode)
pm2 stop uygulama
pm2 delete uygulama

pm2 restart ile pm2 reload farkı kritik: restart süreci kapatıp yenisini açar (1-3 sn downtime); reload cluster mode'da yeni instance'lar ramp up olur, eskiler graceful kapanır — kullanıcı kesinti yaşamaz. Cluster mode değilseniz reload zaten restart'a düşer.

Cluster Mode: Multi-Core'a Yayılma

Node.js single-threaded — tek vCPU dolar, diğerleri boş durur. Cluster mode bu sınırı aşar: -i N ile N child process başlatılır, master gelen TCP bağlantısını round-robin dağıtır.

pm2 start app.js -i max --name uygulama   # vCPU kadar
pm2 start app.js -i 4   --name uygulama   # sabit sayı
pm2 reload uygulama                       # rolling restart

-i max çoğu zaman doğru tercih; ama VDS'iniz 4 vCPU'sa ve aynı sunucuda PostgreSQL + Nginx + Redis çalışıyorsa -i 2 veya -i 3 daha sağlıklı, aksi halde DB ve web sunucu CPU için yarışır.

Cluster kuralları: Uygulama stateless olmalı — in-memory cache (Map, global obj) cluster içinde paylaşılmaz. Session storage Redis'e taşınmalı. WebSocket cluster'da sticky session ister (Nginx ip_hash veya socket.io-redis).

Tercih etmeyin: Cluster mode'u stateful uygulamada "sihirli scale" diye açmayı. Worker A'da login → Worker B'ye request → session yok, login ekranı tekrar gelir. Önce session'ı Redis'e taşıyın, sonra cluster'ı açın.

ecosystem.config.js — Önerilen Yol

CLI flag'leri bir noktadan sonra dağılır; tüm konfigürasyon tek dosyada toplanmalı:

// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: 'uygulama',
      script: './server.js',
      instances: 'max',
      exec_mode: 'cluster',
      autorestart: true,
      watch: false,                      // PROD'DA ASLA TRUE
      max_memory_restart: '500M',        // memory leak emniyeti
      kill_timeout: 5000,                // graceful shutdown süresi
      wait_ready: true,                  // process.send('ready') beklenir
      listen_timeout: 10000,
      env: { NODE_ENV: 'development' },
      env_production: { NODE_ENV: 'production', PORT: 3000 },
      error_file: './logs/err.log',
      out_file: './logs/out.log',
      log_date_format: 'YYYY-MM-DD HH:mm:ss',
      merge_logs: true,
      time: true,
    },
    {
      name: 'worker',                    // cron / queue worker — ayrı app
      script: './worker.js',
      instances: 1,
      exec_mode: 'fork',
      cron_restart: '0 4 * * *',         // her gün 04:00'te restart
      env_production: { NODE_ENV: 'production' },
    },
  ],
};
pm2 start  ecosystem.config.js --env production
pm2 reload ecosystem.config.js --env production   # zero-downtime

ecosystem.config.js git'e commit edilir; .env edilmez. Secrets için dotenv + .env.production runtime'da yüklenir; chmod 600 .env.production ile izin kıs.

Önemli detaylar: watch: false prod'da ASLA true yapmayın — file değişikliği restart eder, CPU yer. max_memory_restart leak'e karşı emniyet. wait_ready: true ile uygulama process.send('ready') çağırana kadar PM2 "online" demez; reload sırasında "uygulama hazır mı?" cevabı, yoksa Nginx eski process kapatılırken yeniye trafik yollar ve 502 alır.

Sistem Boot Startup: PM2 + systemd Entegrasyonu

VDS reboot ettiğinde uygulamaların otomatik başlaması için iki adım:

pm2 startup systemd     # systemd unit oluştur (çıktıyı kopyalayıp çalıştırın)
pm2 save                # mevcut çalışan listesini kaydet
sudo reboot && pm2 list # test

pm2 save kritik — pm2 startup daemon'ı başlatır ama hangi uygulamaların açılacağını ~/.pm2/dump.pm2 dosyasından okur. Yeni uygulama eklediğinizde mutlaka tekrar pm2 save deyin; manuel geri yükleme pm2 resurrect.

Sık yapılan hata: pm2 startup yapılır ama pm2 save unutulur — reboot sonrası daemon koşar, uygulama listesi boş. Çözüm: deploy script'inin son adımı pm2 save olsun.

Log Yönetimi ve pm2-logrotate

Default log lokasyonu ~/.pm2/logs/<app>-out.log, <app>-error.log, cluster için <app>-out__N.log.

Disk dolma riski: PM2 default'ta log rotation yapmaz; bir ay çalışan servis 5-10 GB üretebilir. Çözüm:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'   # her gün 00:00

Çoklu sunucuda logları tek noktada toplamak için rsyslog + Grafana Loki veya Filebeat → Elasticsearch (ELK) pratik yollardır. Tek-sunucu VDS senaryosunda pm2 logs + log rotation yeterli.

max_memory_restart ve Memory Leak

Node.js V8 heap default 1.4-1.7 GB sınırlıdır. Uzun çalışan servislerde leak olursa GC tıkanır. max_memory_restart emniyet supabıdır — leak'i çözmez, etkisini sınırlar:

{ max_memory_restart: '500M' }   // veya '1G', '200K'

Asıl çözüm process.memoryUsage() ile Prometheus metric expose, Grafana'da heap büyümesini gözlemek, heapdump veya clinic.js ile leak'i bulmak. Sınır seçimi: Express API 200-300 MB, Next.js SSR 500 MB-1 GB, resim işleyen worker 1-2 GB; pm2 show <app> ile baseline + %30-50 marj.

Zero-Downtime Deployment Akışı

Buyukweb VDS deploy script'i:

cd /var/www/uygulama
git pull origin main
npm ci --omit=dev
npm run build
pm2 reload ecosystem.config.js --env production
pm2 save

Reload zinciri: PM2 yeni instance başlatır → ready sinyali bekler (listen_timeout 10 sn) → eski'ye SIGINT gönderir → eski graceful shutdown ile in-flight bitirip kapanır (kill_timeout 5 sn) → trafik yeniye akar. Uygulamanızda iki şey gerekir:

const server = app.listen(process.env.PORT || 3000, () => {
  if (process.send) process.send('ready');     // PM2'ye "ready"
});

const shutdown = () => {
  server.close(() => { /* DB close, queue drain */ process.exit(0); });
  setTimeout(() => process.exit(1), 8000);     // güvenlik timeout
};
process.on('SIGINT',  shutdown);
process.on('SIGTERM', shutdown);

Nginx Reverse Proxy Önünde

PM2 ile Node.js 127.0.0.1:3000'de dinler; 80/443'ü dış dünyaya açan ve TLS sonlandıran Nginx önünde durur:

upstream nodebackend {
    server 127.0.0.1:3000;
    keepalive 64;
}

server {
    listen 443 ssl;
    http2 on;
    server_name uygulama.com;

    ssl_certificate     /etc/letsencrypt/live/uygulama.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/uygulama.com/privkey.pem;

    # Static dosyalar Node'a gitmesin
    location /_next/static/ {
        alias /var/www/uygulama/.next/static/;
        expires 1y;
        access_log off;
    }

    location / {
        proxy_pass         http://nodebackend;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
        proxy_read_timeout 60s;
    }
}

Upgrade ve Connection "upgrade" header'ları WebSocket için kritik. Cluster mode'da WebSocket için ip_hash sticky session veya socket.io-redis adapter gerekir.

Buyukweb perspektifi: cPanel Web Hosting paketlerinde Node.js Selector basit Node.js uygulaması için PM2 dokunmadan koşar. Cluster mode, custom port, kendi systemd unit'i, kendi Nginx config'i istiyorsanız E5 v4 VDS doğru seçim — root yetki, NVMe SSD, KVM sanallaştırma, günlük Veeam yedekleme dahil.

PM2 Plus / Self-Host Monitoring

PM2 Plus (dashboard.cloud.pm2.io) ücretli centralized monitoring sunar; mecburi değil, aynı işlevleri self-host ile kurabilirsiniz:

İhtiyaç PM2 Plus Self-Host (open source)
Process metrics Built-in Prometheus + pm2-prometheus-exporter
Dashboard Built-in Grafana
Log centralized Built-in Grafana Loki + Promtail
Alerting Built-in Alertmanager + Slack/Telegram
APM trace Built-in Datadog / New Relic SaaS veya Jaeger

Tek-VDS senaryosunda pm2 monit + log rotation yeterli. SRE kapasiteniz varsa Prometheus + Grafana + Loki kombosu monthly ücret olmadan tam görünürlük verir.

Sık Yapılan Hatalar

Hata Sonuç Çözüm
pm2 startup yapılır, pm2 save unutulur Reboot sonrası uygulama yok Deploy sonu pm2 save
watch: true prod'da Log rotate olunca restart, CPU yer watch: false
Cluster mode + in-memory state Worker A'da login → B'ye request → "kim?" Session Redis'e taşı
Log rotation yok Disk dolar, pm2 list çalışmaz pm2 install pm2-logrotate
WebSocket cluster, sticky yok Kopan socket bağlantıları ip_hash veya socket.io-redis
max_memory_restart yok Leak büyür, OOM kill max_memory_restart: '500M'
PM2 sudo ile başlatılmış /root/.pm2 ve /home/<user>/.pm2 ayrı Hep aynı user, sudo pm2 ASLA

Buyukweb Hosting Bağlantısı

Senaryo Önerilen Paket
Basit Node.js (cluster yok) cPanel Web Hosting — Node.js Selector eklenti
PM2 + Nginx + cluster (bu yazının kapsamı) E5 v4 VDS — root, NVMe SSD, KVM
VDS karşılaştırması Sanal Sunucu (VDS)
Yüksek ölçek Fiziksel Dedicated

E5 v4 VDS PM2 + Node.js için tercih edilen başlangıç: Intel Xeon E5 v4, NVMe SSD, KVM, L3/L4/L7 DDoS, Veeam günlük yedek; Bursa Tier 3 veri merkezi — Türkiye trafiği için düşük gecikme.

Sıkça Sorulan Sorular

PM2 mi yoksa systemd mi?

İkisini birlikte. pm2 startup systemd PM2 daemon'ını başlatan systemd unit'i oluşturur; sunucu boot'ta systemd PM2'yi, PM2 de uygulamalarınızı başlatır. Saf systemd ile tek-instance servis çalıştırmak mümkün, ama cluster mode, pm2 logs, pm2 monit ve graceful reload özellikleri yok. JS-ekosistemde modern Node.js prod için PM2 + systemd kombosu yaygın tercih.

Cluster mode'da -i değeri ne olmalı?

Tipik kural -i max (vCPU kadar). Ama VDS'iniz 4 vCPU'sa ve aynı sunucuda PostgreSQL + Nginx + Redis çalışıyorsa hepsini PM2'ye vermek yerine -i 2 veya -i 3 daha sağlıklı. Test: htop ile yük altında izleyin, vCPU'lar kronik %80 üstüne çıkıyorsa instance sayısını azaltın.

pm2 reload ile pm2 restart farkı nedir?

restart süreci sert kapatır, 1-3 sn downtime — kullanıcı 502 görebilir. reload sadece cluster mode'da çalışır: yeni instance'lar ramp up olur, "ready" sinyali gönderince eskilere graceful shutdown gider, in-flight bitince kapanırlar. Net etki: kullanıcı kesinti yaşamaz. Cluster mode değilseniz reload zaten restart'a düşer.

max_memory_restart değeri ne olmalı?

Uygulamaya bağlı. Küçük Express API için 200-300 MB; Next.js SSR için 500 MB-1 GB; resim işleyen worker 1-2 GB. pm2 show <app> ile birkaç gün baseline RAM'i izleyin, üzerine %30-50 marj koyun.

PM2 Plus gerekli mi?

Mecburi değil. Tek-VDS senaryolarında pm2 monit + log rotation yeterli. Çoklu sunucuda PM2 Plus ücretli paket (set-and-forget) veya Prometheus + Grafana + Loki self-host (ücretsiz, kurulum işçiliği) — SRE kapasitenize göre seçin.

Buyukweb cPanel paketinde PM2 kullanılır mı?

cPanel Node.js Selector basit uygulama (Express API, statik Next.js export) için PM2 olmadan koşar. Cluster mode, ecosystem.config.js, custom port veya pm2 reload zero-downtime istiyorsanız VDS'e geçin — cPanel ortamında PM2'yi tam kontrol edemezsiniz.

WebSocket cluster mode'da nasıl çalışır?

İki yöntem: Sticky session — Nginx ip_hash ile aynı IP hep aynı worker'a (basit, IP değişince kopar); socket.io-redis adapter — Redis pub/sub ile worker'lar arası mesaj rölesi (scalable çözüm). Kombinasyon ideal.


Sonuç

PM2 modern Node.js prod stack'inin günlük aracı; pm2 start app.js kolay başlangıç ama gerçek değer ecosystem.config.js + cluster mode + zero-downtime reload + log rotation + systemd entegrasyonu kombosuyla ortaya çıkıyor. Dört altın kural: watch: false prod'da, pm2 save unutmayın, cluster için stateless uygulama, max_memory_restart ile leak emniyeti.

Buyukweb E5 v4 VDS (₺250/ay'dan) PM2 + Node.js stack'i için root yetkisi, NVMe SSD ve Veeam günlük yedeği sunar. Teknik destek: 0850 302 60 70 veya iletişim sayfası.

İlgili Buyukweb Hizmetleri

Node.js + PM2 stack'ini Türkiye lokasyonlu sunucularda çalıştırmak için:

Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfası yazabilirsiniz.

Sunucu Yönetimi İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#node.js#pm2#sunucu#server yönetimi#sistem yönetimi

Bu yazıyı paylaş