Node.js uygulamalarınızı bir Ubuntu Sanal Özel Sunucu (VPS) üzerinde kesintisiz, performanslı ve güvenilir bir şekilde çalıştırmak mı istiyorsunuz? Bu kapsamlı rehber, PM2 kullanarak Node.js ortamınızı baştan sona nasıl kuracağınızı ve yöneteceğinizi adım adım açıklıyor, böylece uygulamalarınız her zaman yayında kalır.
Giriş: Node.js Uygulamalarınız Neden Kesintisiz Çalışmalı ve PM2 Nasıl Bir Çözüm Sunar?
Modern web uygulamaları dünyasında, Node.js, yüksek performanslı ve ölçeklenebilir backend sistemleri geliştirmek için popüler bir seçim haline gelmiştir. Ancak, bir Node.js uygulamasını geliştirip bir sunucuya dağıtmak, işin sadece yarısıdır. Uygulamanın sürekli olarak çalışır durumda kalmasını, olası hatalarda otomatik olarak yeniden başlatılmasını, sunucu kaynaklarını verimli kullanmasını ve yüksek trafik altında bile performansını korumasını sağlamak, çoğu zaman göz ardı edilen kritik bir adımdır. Bir Node.js uygulamasının çökmesi, kullanıcı deneyimini olumsuz etkilemekle kalmaz, aynı zamanda iş sürekliliğini de tehlikeye atar. İşte tam bu noktada, PM2 (Process Manager 2) devreye girerek bu zorluklara güçlü ve etkili çözümler sunar.
Peki, bir Node.js uygulamasını manuel olarak başlatmak yerine neden PM2 gibi bir süreç yöneticisine ihtiyaç duyarız? Geleneksel yöntemlerle bir Node.js uygulamasını başlattığınızda (örneğin, node app.js komutuyla), SSH oturumunuzu kapattığınız anda uygulama durur. Ayrıca, uygulamanızda beklenmedik bir hata meydana geldiğinde veya sunucu kaynaklarında bir sorun oluştuğunda, uygulama tamamen durur ve manuel müdahale olmadan tekrar çalışmaya başlamaz. Bu durum, özellikle canlı ortamda çalışan kritik uygulamalar için kabul edilemez bir risktir. PM2, bu tür senaryoları ele almak için tasarlanmış, Node.js uygulamalarını üretim ortamında yönetmek için olmazsa olmaz bir araçtır. Otomatik yeniden başlatma, yük dengeleme, log yönetimi, izleme ve daha birçok özelliğiyle PM2, Node.js geliştiricilerinin ve sistem yöneticilerinin hayatını kolaylaştırır.
Bu makalede, Ubuntu tabanlı bir VPS üzerinde Node.js uygulamalarınızı PM2 ile nasıl kuracağınızı, yöneteceğinizi ve optimize edeceğinizi adım adım öğreneceksiniz. Sıfırdan başlayarak, temel kurulumdan gelişmiş konfigürasyonlara kadar her detayı ele alacağız. Amacımız, uygulamalarınızın her zaman yayında kalmasını sağlayacak, güvenilir ve performanslı bir ortam yaratmanıza yardımcı olmaktır. İster yeni başlayan bir geliştirici olun, ister deneyimli bir DevOps mühendisi, bu rehber size PM2’nin gücünü keşfetmeniz ve Node.js dağıtım stratejilerinizi bir üst seviyeye taşımanız için gerekli tüm bilgileri sunacaktır.
Neden PM2 Kullanmalıyız? Temel Kavramlara Derin Bir Bakış
Node.js uygulamalarını bir sunucuya dağıtırken karşılaşılan en büyük zorluklardan biri, uygulamanın sürekli çalışır durumda kalmasını sağlamaktır. İşte bu noktada PM2 devreye giriyor. Ancak PM2’nin ne olduğunu ve neden bu kadar önemli olduğunu anlamak için öncelikle temel kavramlara kısaca değinmek faydalı olacaktır.
Node.js Nedir ve Neden Popülerdir?
Node.js, Google Chrome’un V8 JavaScript motoru üzerine kurulu, sunucu tarafı JavaScript çalışma zamanı ortamıdır. Geliştiricilerin JavaScript’i hem istemci hem de sunucu tarafında kullanarak tam yığın uygulamalar oluşturmasına olanak tanır. Olay güdümlü, eşzamansız mimarisi sayesinde Node.js, yüksek performanslı ve ölçeklenebilir ağ uygulamaları, API’ler, mikro hizmetler ve gerçek zamanlı uygulamalar geliştirmek için son derece uygundur. Özellikle I/O yoğun uygulamalarda gösterdiği üstün performans, onu modern web geliştirmenin vazgeçilmez araçlarından biri yapmıştır.
VPS Nedir ve Neden Tercih Edilir?
VPS (Virtual Private Server), paylaşımlı barındırma ile özel sunucu arasında bir köprü görevi gören bir barındırma çözümüdür. Tek bir fiziksel sunucu üzerinde birden fazla sanal sunucu oluşturulur ve her bir VPS, kendine ait işletim sistemine, kaynaklara (CPU, RAM, depolama) ve root erişimine sahiptir. Bu, kullanıcılara paylaşımlı barındırmadan daha fazla kontrol ve esneklik sunarken, özel sunucu kadar maliyetli değildir. Node.js uygulamaları için VPS, gerekli esnekliği, performansı ve ölçeklenebilirliği uygun maliyetle sunması nedeniyle ideal bir platformdur.
PM2 Nedir? Bir Süreç Yöneticisinden Çok Daha Fazlası
PM2 (Process Manager 2), Node.js uygulamalarını üretim ortamında yönetmek için tasarlanmış, açık kaynaklı, gelişmiş bir süreç yöneticisidir. Bir Node.js uygulamasını sadece başlatmaktan çok daha fazlasını yapar. PM2’nin temel avantajları ve özellikleri şunlardır:
- Otomatik Yeniden Başlatma: Uygulamanız bir hata nedeniyle çökerse veya beklenmedik bir şekilde durursa, PM2 onu otomatik olarak yeniden başlatır ve uygulamanızın kesintisiz çalışmasını sağlar. Bu, özellikle canlı ortamda kritik öneme sahiptir.
- Yük Dengeleme (Cluster Modu): Node.js tek iş parçacıklı bir yapıya sahip olsa da, PM2’nin cluster modu sayesinde uygulamanızı sunucunuzdaki tüm CPU çekirdeklerini kullanarak birden fazla işlem olarak çalıştırabilirsiniz. Bu, gelen istekleri bu işlemler arasında dengeleyerek uygulamanızın performansını ve hata toleransını önemli ölçüde artırır.
- Sıfır Kesintiyle Yeniden Yükleme: Uygulamanızı güncellediğinizde veya yeni kod dağıttığınızda, PM2 uygulamanızı kullanıcılar için herhangi bir kesinti yaşatmadan yeniden yükleyebilir. Bu, “hot reload” olarak da bilinir ve dağıtım süreçlerini çok daha sorunsuz hale getirir.
- İzleme ve Log Yönetimi: PM2, uygulamalarınızın kaynak kullanımını (CPU, RAM) izlemenize olanak tanır ve tüm logları (çıktı ve hata) merkezi bir şekilde yönetir. Bu, sorun giderme ve performans analizi için hayati öneme sahiptir.
- Otomatik Başlatma: Sunucunuz yeniden başlatıldığında, PM2 uygulamalarınızı otomatik olarak başlatacak şekilde yapılandırılabilir. Bu, manuel müdahaleye gerek kalmadan sistemin kendiliğinden toparlanmasını sağlar.
- Konfigürasyon Yönetimi: Uygulamalarınızı bir JSON veya JavaScript dosyası aracılığıyla kolayca yapılandırabilirsiniz. Bu, birden fazla uygulama veya karmaşık dağıtım senaryoları için esneklik sunar.
Özetle, PM2, Node.js uygulamalarınızın üretim ortamında güvenilir, performanslı ve yönetilebilir olmasını sağlayan kapsamlı bir çözümdür. Uygulamanızın sürekli yayında kalmasını garantileyerek, geliştiricilerin asıl işlerine, yani kod yazmaya odaklanmasına olanak tanır. Bir sonraki bölümde, Ubuntu VPS’inizi Node.js ve PM2 kurulumu için nasıl hazırlayacağımızı adım adım inceleyeceğiz.
Ubuntu VPS Hazırlığı: Node.js ve Temel Bağımlılıkların Kurulumu Nasıl Yapılır?
Node.js uygulamanızı PM2 ile yönetmeye başlamadan önce, Ubuntu VPS’inizde Node.js çalışma zamanı ortamını ve gerekli bağımlılıkları kurmanız gerekir. Bu bölüm, sunucunuza güvenli bir şekilde bağlanmaktan Node.js’i doğru bir şekilde yüklemeye kadar tüm adımları kapsar.
1. VPS’e SSH ile Bağlanma
İlk adım, SSH (Secure Shell) kullanarak Ubuntu VPS’inize bağlanmaktır. Bir terminal veya SSH istemcisi kullanarak aşağıdaki komutu çalıştırın:
ssh kullanici_adiniz@sunucu_ip_adresiniz
Burada kullanici_adiniz genellikle root veya VPS sağlayıcınızın size atadığı kullanıcı adıdır. sunucu_ip_adresiniz ise VPS’inizin genel IP adresidir. Şifrenizi girdikten sonra sunucunuza başarılı bir şekilde bağlanmış olmalısınız.
2. Sistemi Güncelleme ve Temel Bağımlılıkları Kurma
Sunucunuzda her zaman en güncel paketlere sahip olmak iyi bir pratiktir. Bu, güvenlik açıklarını kapatmaya ve uyumluluk sorunlarını önlemeye yardımcı olur. Ayrıca, Node.js kurulumu için gerekli olabilecek bazı temel paketleri de yükleyeceğiz.
sudo apt update
sudo apt upgrade -y
sudo apt install -y curl git build-essential
sudo apt update: Paket listelerini günceller.sudo apt upgrade -y: Yüklü paketleri en son sürümlerine yükseltir (-yparametresi onay istemeden devam etmeyi sağlar).sudo apt install -y curl git build-essential:curl(dosya indirmek için),git(kod depolamak ve çekmek için) vebuild-essential(derleme araçları, Node.js modülleri için gerekli olabilir) paketlerini kurar.
3. Node.js ve npm Kurulumu (NVM Kullanarak Önerilir)
Node.js’i kurmanın birden fazla yolu vardır, ancak en esnek ve önerilen yöntem NVM (Node Version Manager) kullanmaktır. NVM, farklı Node.js sürümlerini aynı sunucuda kolayca kurmanıza, yönetmenize ve aralarında geçiş yapmanıza olanak tanır. Bu, farklı projelerin farklı Node.js sürümlerine ihtiyaç duyması durumunda son derece kullanışlıdır.
NVM Kurulumu:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
Bu komut NVM’yi indirir ve kurar. Kurulumdan sonra, terminalinizi kapatıp yeniden açmanız veya aşağıdaki komutu çalıştırmanız gerekebilir, böylece NVM kabuk ortamınıza yüklenir:
source ~/.bashrc
NVM’nin doğru yüklendiğini kontrol etmek için:
nvm --version
Node.js Kurulumu (NVM ile):
Şimdi NVM’yi kullanarak Node.js’in en son LTS (Uzun Süreli Destek) sürümünü kurabiliriz:
nvm install --lts
Belirli bir sürümü kurmak isterseniz:
nvm install 18
Kurulan Node.js sürümünü varsayılan olarak ayarlamak için:
nvm use --lts
Node.js ve npm’in doğru yüklendiğini doğrulamak için:
node -v
npm -v
Bu komutlar, Node.js ve npm’in yüklü sürümlerini göstermelidir.
4. Basit Bir Node.js Uygulaması Oluşturma (Örnek)
PM2 ile yöneteceğimiz basit bir Node.js uygulaması oluşturalım. Sunucunuzda bir dizin oluşturun ve içine app.js adında bir dosya ekleyin:
mkdir my-nodejs-app
cd my-nodejs-app
nano app.js
app.js dosyasına aşağıdaki kodu yapıştırın:
const http = require('http');
const hostname = '0.0.0.0'; // Tüm ağ arayüzlerinden erişime izin ver
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Merhaba Dunya! Bu benim Node.js uygulamam.\n');
});
server.listen(port, hostname, () => {
console.log(Sunucu http://${hostname}:${port}/ adresinde calisiyor.);
});
// Uygulamanın çökmesini simüle etmek için rastgele bir hata fırlatabiliriz
// setTimeout(() => {
// throw new Error('Beklenmedik bir hata olustu!');
// }, 10000);
Dosyayı kaydedin (Ctrl+X, Y, Enter). Şimdi bu uygulamayı manuel olarak çalıştırabilirsiniz:
node app.js
Uygulamanızın çalıştığını görmelisiniz. Ancak, SSH oturumunuzu kapattığınızda veya bir hata oluştuğunda duracaktır. İşte burada PM2’nin devreye girmesi gerekiyor. Bir sonraki bölümde, PM2’yi kurup bu uygulamayı onunla nasıl yöneteceğimizi detaylıca inceleyeceğiz.
PM2 ile Node.js Uygulamasını Yönetmek: Adım Adım Kurulum ve Başlatma
Node.js ve temel bağımlılıkları kurduktan sonra, sıra geldi PM2’yi yüklemeye ve Node.js uygulamanızı onunla yönetmeye. Bu bölüm, PM2’nin kurulumundan uygulamanızı başlatmaya, izlemeye ve sunucu yeniden başlatıldığında otomatik olarak çalışmasını sağlamaya kadar her adımı içerir.
1. PM2 Kurulumu
PM2, npm aracılığıyla global olarak kolayca kurulabilir. Global kurulum, PM2 komutlarını sisteminizde herhangi bir yerden kullanmanıza olanak tanır.
npm install pm2 -g
Kurulum tamamlandıktan sonra, PM2’nin doğru yüklendiğini doğrulamak için sürümünü kontrol edebilirsiniz:
pm2 --version
Bu komut, yüklü PM2 sürümünü göstermelidir.
2. Node.js Uygulamasını PM2 ile Başlatma
Önceki bölümde oluşturduğumuz app.js uygulamasını PM2 ile başlatmanın zamanı geldi. Uygulamanızın bulunduğu dizine (my-nodejs-app) gidin ve aşağıdaki komutu çalıştırın:
cd ~/my-nodejs-app
pm2 start app.js --name "my-first-app"
Bu komut:
pm2 start app.js:app.jsdosyasını PM2 ile bir süreç olarak başlatır.--name "my-first-app": Uygulamanıza kolayca tanınabilir bir isim verir. Bu isim, PM2 listelerinde ve izleme araçlarında görünecektir. İsim vermezseniz, PM2 otomatik olarak dosya adını kullanır.
Uygulamanız başarıyla başlatıldığında, PM2 size süreç hakkında bilgi veren bir tablo gösterecektir:
┌────┬────────────────────┬──────────┬──────┬───────────┬───────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼───────────┼──────────┤
│ 0 │ my-first-app │ fork │ 0 │ online │ 0% │ 15.0 MB │
└────┴────────────────────┴──────────┴──────┴───────────┴───────────┴──────────┘
Burada status sütununda online yazması, uygulamanızın başarıyla çalıştığını gösterir. Artık SSH oturumunuzu kapatsanız bile uygulamanız arka planda çalışmaya devam edecektir.
3. PM2 Komutları: Uygulamanızı Yönetme
PM2, uygulamalarınızı yönetmek için bir dizi kullanışlı komut sunar:
- Tüm Uygulamaları Listeleme:
pm2 listBu komut, PM2 tarafından yönetilen tüm süreçleri ve durumlarını gösterir.
- Uygulama Loglarını Görüntüleme:
pm2 logs my-first-appBelirli bir uygulamanın (veya tüm uygulamaların) gerçek zamanlı loglarını görmek için kullanılır.
--lines Nile son N satırı görebilirsiniz. - Uygulamayı Durdurma:
pm2 stop my-first-appBelirli bir uygulamayı durdurur.
pm2 stop alltüm uygulamaları durdurur. - Uygulamayı Yeniden Başlatma:
pm2 restart my-first-appBelirli bir uygulamayı yeniden başlatır. Bu, kod değişikliklerinden sonra uygulamayı güncellemek için kullanışlıdır.
- Uygulamayı Silme:
pm2 delete my-first-appPM2 listesinden bir uygulamayı kaldırır ve sürecini durdurur.
pm2 delete alltüm uygulamaları siler. - PM2 Monitör:
pm2 monitTüm uygulamalarınızın CPU, bellek kullanımı ve loglarını gerçek zamanlı olarak izleyebileceğiniz etkileşimli bir pano açar. Bu, performans sorunlarını teşhis etmek için çok değerlidir.
4. Uygulamaların Sunucu Yeniden Başlatıldığında Otomatik Çalışmasını Sağlama
PM2’nin en önemli özelliklerinden biri, sunucu yeniden başlatıldığında uygulamalarınızı otomatik olarak başlatabilmesidir. Bu, sistemin kesintisiz çalışmasını garanti altına alır.
Önce, PM2’nin mevcut süreç listesini kaydedin:
pm2 save
Bu komut, PM2’nin o anki tüm uygulamalarının bir anlık görüntüsünü alır ve onları bir konfigürasyon dosyasına kaydeder.
Ardından, PM2’nin sistem başlangıcında otomatik olarak başlamasını sağlayacak bir başlangıç betiği oluşturun:
pm2 startup
Bu komut, kullandığınız işletim sistemine (Ubuntu için systemd) uygun bir komut çıktısı verecektir. Çıkan komutu kopyalayıp yapıştırarak çalıştırın. Genellikle şöyle bir şey olacaktır:
sudo env PATH=$PATH:/home/kullanici_adiniz/.nvm/versions/node/vXX.Y.Z/bin /home/kullanici_adiniz/.nvm/versions/node/vXX.Y.Z/lib/node_modules/pm2/bin/pm2 startup systemd -u kullanici_adiniz --hp /home/kullanici_adiniz
Bu komutu çalıştırdıktan sonra, sunucunuzu yeniden başlattığınızda (sudo reboot) PM2’nin ve onun yönettiği tüm uygulamaların otomatik olarak çalışmaya başladığını göreceksiniz. Yeniden başlattıktan sonra tekrar SSH ile bağlanıp pm2 list komutunu çalıştırarak durumu kontrol edebilirsiniz.
pm2 startup komutu, NVM ile yüklü Node.js sürümleri için doğru PATH’i ayarlamakta bazen zorlanabilir. Eğer pm2 list komutunu yeniden başlatma sonrası boş görüyorsanız, yukarıdaki sudo env PATH=$PATH:... komutunun doğru PATH’i içerdiğinden emin olun. Gerekirse NVM’nin yüklediği Node.js’in tam yolunu manuel olarak belirtebilirsiniz.
Artık Node.js uygulamanız PM2 tarafından güvenilir bir şekilde yönetiliyor ve sunucu yeniden başlatılsa bile otomatik olarak çalışmaya devam ediyor. Bir sonraki bölümde, PM2’nin daha gelişmiş özelliklerini ve konfigürasyon yönetimini inceleyerek uygulamanızın performansını ve esnekliğini nasıl artırabileceğinizi göreceğiz.
Gelişmiş PM2 Özellikleri ve Konfigürasyon Yönetimi: Uygulama Performansını Nasıl Artırırsınız?
PM2, sadece uygulamaları başlatmak ve yeniden başlatmaktan çok daha fazlasını sunar. Gelişmiş özellikleri sayesinde Node.js uygulamalarınızın performansını, güvenilirliğini ve yönetimini önemli ölçüde artırabilirsiniz. Bu bölümde, cluster modu, JSON konfigürasyon dosyaları, ortam değişkenleri ve log yönetimi gibi konulara odaklanacağız.
1. Cluster Modu ile Yük Dengeleme
Node.js, varsayılan olarak tek iş parçacıklı bir yapıya sahiptir, yani tek bir CPU çekirdeğini kullanır. Bu, çok çekirdekli sunucularda CPU kaynaklarının tam olarak kullanılmadığı anlamına gelir. PM2’nin cluster modu, bu sınırlamayı aşarak uygulamanızın sunucunuzdaki tüm CPU çekirdeklerini kullanmasını sağlar ve gelen istekleri bu çekirdekler arasında dağıtarak yük dengelemesi yapar.
Uygulamanızı cluster modunda başlatmak için -i veya --instances parametresini kullanabilirsiniz. Örneğin, sunucunuzdaki tüm CPU çekirdeklerini kullanmak için:
pm2 start app.js -i 0 --name "my-cluster-app"
Buradaki -i 0 parametresi, PM2’ye sunucudaki tüm kullanılabilir CPU çekirdekleri kadar uygulama örneği oluşturmasını söyler. Belirli bir sayı da belirtebilirsiniz, örneğin -i 4 ile 4 örnek oluşturulur. pm2 list komutunu çalıştırdığınızda, uygulamanızın birden fazla ID ile listelendiğini göreceksiniz, her biri ayrı bir Node.js süreci olarak çalışır:
┌────┬────────────────────┬──────────┬──────┬───────────┬───────────┬──────────┐
│ id │ name │ mode │ ↺ │ status │ cpu │ memory │
├────┼────────────────────┼──────────┼──────┼───────────┼───────────┼──────────┤
│ 0 │ my-cluster-app │ cluster │ 0 │ online │ 0% │ 15.0 MB │
│ 1 │ my-cluster-app │ cluster │ 0 │ online │ 0% │ 15.0 MB │
│ 2 │ my-cluster-app │ cluster │ 0 │ online │ 0% │ 15.0 MB │
│ 3 │ my-cluster-app │ cluster │ 0 │ online │ 0% │ 15.0 MB │
└────┴────────────────────┴──────────┴──────┴───────────┴───────────┴──────────┘
Bu kurulum, uygulamanızın hem performansını artırır hem de bir örneğin çökmesi durumunda diğerlerinin çalışmaya devam etmesi sayesinde hata toleransını yükseltir.
2. JSON Konfigürasyon Dosyaları (Ecosystem File)
Birden fazla uygulama yönetiyorsanız veya karmaşık konfigürasyonlara ihtiyacınız varsa, komut satırı argümanları yeterli olmayabilir. PM2, uygulamalarınızı JSON veya JavaScript (ecosystem.config.js) dosyaları aracılığıyla yapılandırmanıza olanak tanır. Bu, konfigürasyonları versiyon kontrolüne almanızı ve dağıtımı kolaylaştırmanızı sağlar.
Örnek bir ecosystem.config.js dosyası oluşturalım:
nano ecosystem.config.js
İçine aşağıdaki içeriği yapıştırın:
module.exports = {
apps : [{
name: "my-first-app",
script: "./app.js",
instances: "max", // Veya belirli bir sayı: 4
exec_mode: "cluster", // Veya "fork"
watch: false, // Kod değişikliklerinde otomatik yeniden başlatma (geliştirme için iyi)
max_memory_restart: "200M", // Bellek kullanımı bu sınırı aşarsa yeniden başlat
env: {
NODE_ENV: "development",
PORT: 3000
},
env_production: {
NODE_ENV: "production",
PORT: 8080,
}
}, {
name: "my-second-app",
script: "./server.js",
instances: 1,
exec_mode: "fork",
env: {
NODE_ENV: "development",
API_KEY: "dev_key"
},
env_production: {
NODE_ENV: "production",
API_KEY: "prod_key"
}
}]
};
Bu dosya, iki farklı uygulama için konfigürasyonları içerir. my-first-app cluster modunda ve maksimum örnekle çalışırken, my-second-app fork modunda tek bir örnekle çalışır. Ayrıca, farklı ortamlar (development ve production) için ortam değişkenleri tanımlanmıştır.
Uygulamaları bu konfigürasyon dosyasıyla başlatmak için:
pm2 start ecosystem.config.js
Belirli bir ortamı kullanarak başlatmak için:
pm2 start ecosystem.config.js --env production
Bu, env_production bloğundaki ortam değişkenlerinin kullanılmasını sağlar.
3. Ortam Değişkenleri Yönetimi
Uygulamalarınızın farklı ortamlar (geliştirme, test, üretim) için farklı konfigürasyonlara (veritabanı bağlantı dizeleri, API anahtarları vb.) ihtiyacı olabilir. PM2, ortam değişkenlerini yönetmek için güçlü araçlar sunar:
- Komut Satırından:
pm2 start app.js --name "my-app" --env NODE_ENV=production --env DB_HOST=localhost - Ecosystem Dosyasında: Yukarıdaki örnekte gösterildiği gibi,
envveenv_productiongibi bloklar kullanarak ortam değişkenlerini tanımlayabilirsiniz. Bu yöntem, özellikle birden fazla değişken veya ortam için daha düzenlidir.
Ortam değişkenleri, uygulamanızın kodunda process.env.DEGISKEN_ADI şeklinde erişilebilir.
4. Log Yönetimi ve Rotasyonu
Uygulama logları, sorun giderme ve performans analizi için kritik öneme sahiptir. PM2, logları otomatik olarak toplar ve yönetir. Ancak, log dosyalarının zamanla çok büyümesini önlemek için log rotasyonu önemlidir.
PM2, kendi log rotasyon modülüne sahiptir:
pm2 install pm2-logrotate
Kurulumdan sonra, pm2-logrotate modülünü yapılandırabilirsiniz. Örneğin, logların günlük olarak döndürülmesi ve belirli bir boyuta ulaştığında sıkıştırılması için:
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:rotateModule true
Bu ayarlar, her log dosyasının maksimum 10MB olmasını, 7 gün boyunca saklanmasını ve sıkıştırılmasını sağlar. rotateModule true ile PM2’nin kendi logları da döndürülecektir.
pm2 monit komutuyla uygulamalarınızın anlık CPU ve bellek kullanımını takip ederek olası performans darboğazlarını erkenden tespit edebilirsiniz.
Bu gelişmiş özellikler, Node.js uygulamalarınızın üretim ortamında daha kararlı, daha performanslı ve daha kolay yönetilebilir olmasını sağlar. Bir sonraki bölümde, tüm bu bilgileri gerçek dünya senaryosunda bir e-ticaret uygulamasının dağıtımı ve yönetimi üzerinden pekiştireceğiz.
Gerçek Dünya Senaryosu: Bir E-ticaret Uygulamasının PM2 ile Dağıtımı ve Yönetimi
Şimdiye kadar öğrendiğimiz PM2 bilgilerini somut bir senaryo üzerinden ele alalım: Yüksek trafikli bir e-ticaret uygulamasının Ubuntu VPS üzerinde PM2 ile dağıtımı ve yönetimi. Bu vaka analizi, PM2’nin gerçek dünyadaki faydalarını ve karşılaşılabilecek sorunlara nasıl çözüm sunduğunu gösterecektir.
Senaryo: “ShopPulse” E-ticaret Platformu
Uygulama: “ShopPulse”, Node.js (Express.js ile) ve MongoDB kullanan, ürün katalogları, kullanıcı hesapları, sepet ve ödeme işlemleri gibi standart özelliklere sahip bir e-ticaret platformudur. Uygulama, API hizmetleri sunar ve bir ön yüz (React veya Vue.js) bu API’leri tüketir.
Sorunlar ve Zorluklar (PM2 Öncesi):
- Kesinti Süreleri: Uygulama, bazen beklenmedik hatalar nedeniyle çöküyor ve manuel olarak yeniden başlatılana kadar hizmet veremiyordu. Bu durum, özellikle kampanya dönemlerinde ciddi gelir kayıplarına yol açıyordu.
- Performans Darboğazları: Yoğun saatlerde veya özel indirim günlerinde, sunucuya gelen istek sayısı arttığında uygulamanın yanıt süreleri uzuyor, hatta bazen tamamen kilitleniyordu. Tek çekirdek üzerinde çalışan Node.js süreci, sunucunun tüm CPU gücünü kullanamıyordu.
- Dağıtım Zorlukları: Yeni özellikler veya hata düzeltmeleri dağıtılırken, uygulama bir süreliğine durdurulmak zorunda kalıyordu. Bu da kullanıcılar için kesintiler anlamına geliyordu.
- İzleme ve Sorun Giderme: Uygulama çöktüğünde veya yavaşladığında, sorunun kaynağını bulmak zordu çünkü loglar düzensizdi ve gerçek zamanlı izleme imkanları kısıtlıydı.
PM2 ile Çözümler ve Uygulama
ShopPulse ekibi, yukarıdaki sorunları çözmek ve uygulamanın güvenilirliğini artırmak için PM2’yi kullanmaya karar verdi. İşte adım adım uyguladıkları çözümler:
1. PM2 Kurulumu ve Temel Başlatma
Öncelikle, Ubuntu VPS üzerine Node.js ve PM2 global olarak kuruldu:
npm install pm2 -g
Ardından, uygulamanın ana başlangıç dosyası (server.js olduğu varsayılarak) PM2 ile başlatıldı:
cd /var/www/shoppulse
pm2 start server.js --name "shoppulse-api"
Bu sayede, uygulamanın çökmesi durumunda PM2 otomatik olarak yeniden başlatma garantisi verdi.
2. Performans ve Hata Toleransı için Cluster Modu
ShopPulse, yüksek trafikli bir uygulama olduğu için performans darboğazlarını aşmak amacıyla PM2’nin cluster modunu benimsedi. Sunucularında 4 adet CPU çekirdeği bulunduğundan, uygulamayı 4 örnek olarak çalıştırmak için bir ecosystem.config.js dosyası oluşturdular:
// /var/www/shoppulse/ecosystem.config.js
module.exports = {
apps : [{
name: "shoppulse-api",
script: "./server.js",
instances: "max", // Sunucudaki tüm CPU çekirdeklerini kullan
exec_mode: "cluster",
watch: false,
ignore_watch: ["node_modules", "logs"],
max_memory_restart: "500M", // Bellek kullanımı 500MB'ı aşarsa yeniden başlat
log_file: "/var/log/shoppulse/shoppulse-api.log",
error_file: "/var/log/shoppulse/shoppulse-api-error.log",
out_file: "/var/log/shoppulse/shoppulse-api-out.log",
env: {
NODE_ENV: "development",
PORT: 3000,
MONGODB_URI: "mongodb://localhost:27017/shoppulse_dev"
},
env_production: {
NODE_ENV: "production",
PORT: 8080, // Nginx ile 80 veya 443'e yönlendirilecek
MONGODB_URI: "mongodb://localhost:27017/shoppulse_prod"
}
}]
};
Uygulama bu konfigürasyon dosyası ile başlatıldı:
pm2 start ecosystem.config.js --env production
Böylece, gelen istekler 4 farklı Node.js süreci arasında dengelenerek uygulamanın aynı anda daha fazla isteği işleyebilmesi sağlandı ve bir sürecin çökmesi durumunda diğerleri hizmet vermeye devam etti.
3. Kesintisiz Dağıtım (Zero-Downtime Deployment)
Yeni bir sürüm dağıtıldığında, ShopPulse ekibi pm2 reload komutunu kullanarak kesintisiz bir güncelleme gerçekleştirdi:
cd /var/www/shoppulse
git pull origin main # Yeni kodu çek
pm2 reload shoppulse-api # Uygulamayı kesintisiz yeniden yükle
pm2 reload komutu, eski süreçleri durdurmadan önce yeni süreçleri başlatır, böylece kullanıcılar için herhangi bir kesinti yaşanmaz.
4. Gelişmiş Log Yönetimi ve İzleme
Logların düzenli olması için ecosystem.config.js dosyasında özel log dosyaları tanımlandı. Ayrıca, pm2-logrotate modülü kuruldu:
pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true
Bu sayede log dosyaları belirli bir boyuta ulaştığında otomatik olarak döndürüldü ve sıkıştırılarak disk alanı tasarrufu sağlandı. pm2 monit komutuyla da uygulama süreçlerinin CPU ve bellek kullanımı anlık olarak takip edildi, bu da olası sızıntıların veya performans sorunlarının erken tespit edilmesini sağladı.
5. Nginx ile Ters Proxy Entegrasyonu
PM2 uygulamaları genellikle doğrudan internete açık değildir. ShopPulse, gelen HTTP/HTTPS isteklerini Node.js uygulamasına yönlendirmek ve SSL/TLS sonlandırması yapmak için Nginx’i bir ters proxy olarak kullandı. Nginx konfigürasyonu şu şekilde ayarlandı:
# /etc/nginx/sites-available/shoppulse.conf
server {
listen 80;
server_name www.shoppulse.com shoppulse.com;
location / {
proxy_pass http://localhost:8080; # PM2 tarafından yönetilen Node.js uygulamasının portu
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
}
Bu konfigürasyon, 80 numaralı porttan gelen tüm istekleri localhost:8080 adresinde çalışan Node.js uygulamasına yönlendirdi. SSL sertifikası (Let’s Encrypt ile) Nginx üzerinde yapılandırılarak güvenli iletişim sağlandı.
Bu senaryo, PM2’nin Node.js uygulamalarının üretim ortamında nasıl daha güvenilir, performanslı ve yönetilebilir hale getirilebileceğini açıkça göstermektedir. Kesintisiz çalışma, yük dengeleme, kolay dağıtım ve kapsamlı izleme yetenekleri sayesinde ShopPulse, kullanıcılarına daha iyi bir deneyim sunarken operasyonel yükünü de azalttı.
Sonuç: PM2 ile Node.js Uygulamalarınızı Güvenle Üretime Taşıyın
Bu kapsamlı rehber boyunca, bir Ubuntu VPS üzerinde Node.js uygulamalarınızı PM2 ile nasıl kuracağınızı ve yöneteceğinizi adım adım inceledik. Modern web uygulamalarının sürekli erişilebilir olması gerektiği gerçeğiyle yola çıkarak, PM2’nin bu kritik ihtiyacı nasıl karşıladığını detaylı bir şekilde gördük. Node.js’in temelinden başlayarak, VPS ortamının hazırlanması, PM2’nin kurulumu, uygulamaların başlatılması, izlenmesi ve otomatik olarak yeniden başlatılması gibi temel adımları başarıyla tamamladık.
Ayrıca, PM2’nin cluster modu ile Node.js uygulamalarınızın performansını ve hata toleransını nasıl artırabileceğinizi, ecosystem.config.js dosyalarıyla konfigürasyon yönetimini nasıl basitleştireceğinizi ve ortam değişkenlerini nasıl kullanacağınızı öğrendik. Log yönetimi ve rotasyonu gibi operasyonel konulara da değinerek, uygulamanızın uzun vadeli sürdürülebilirliğini sağlama yöntemlerini keşfettik. Gerçek dünya senaryosu olan “ShopPulse” e-ticaret platformu örneği, tüm bu bilgilerin pratik uygulamalarını somut bir şekilde gözler önüne serdi.
PM2, Node.js geliştiricileri ve sistem yöneticileri için vazgeçilmez bir araçtır. Uygulamalarınızın kesintisiz çalışmasını garanti altına alarak, olası çökmelerde otomatik yeniden başlatma sağlayarak ve sunucu kaynaklarını verimli bir şekilde kullanarak operasyonel yükü önemli ölçüde azaltır. Yük dengeleme yetenekleri sayesinde yüksek trafikli uygulamalar bile sorunsuz bir şekilde hizmet vermeye devam edebilir. Kapsamlı izleme ve loglama özellikleri ise sorun giderme süreçlerini hızlandırır ve uygulamanızın sağlığını sürekli kontrol altında tutmanızı sağlar.
Artık Node.js uygulamalarınızı bir Ubuntu VPS üzerinde PM2 ile güvenle dağıtabilir ve yönetebilirsiniz. Bu rehberdeki bilgileri uygulayarak, daha sağlam, daha performanslı ve daha yönetilebilir bir üretim ortamı oluşturma yolunda önemli bir adım atmış olacaksınız. Uygulamalarınızın her zaman yayında kalması dileğiyle!
Sıkça Sorulan Sorular (SSS)
1. PM2 nedir ve neden kullanmalıyım?
PM2 (Process Manager 2), Node.js uygulamalarını üretim ortamında yönetmek için kullanılan gelişmiş, açık kaynaklı bir süreç yöneticisidir. Uygulamalarınızın çökmesi durumunda otomatik olarak yeniden başlatılmasını sağlar, sunucunuzdaki tüm CPU çekirdeklerini kullanarak yük dengelemesi yapar (cluster modu), logları yönetir, izleme araçları sunar ve sunucu yeniden başlatıldığında uygulamaların otomatik olarak başlamasını sağlar. Kesintisiz çalışma, yüksek performans ve kolay yönetim için PM2 kullanmak kritik öneme sahiptir.
2. PM2’nin cluster modu ne işe yarar ve ne zaman kullanmalıyım?
PM2’nin cluster modu, Node.js uygulamanızın sunucunuzdaki tüm CPU çekirdeklerini kullanarak birden fazla işlem olarak çalışmasını sağlar. Node.js tek iş parçacıklı olduğundan, cluster modu bu sınırlamayı aşarak uygulamanızın performansını ve hata toleransını artırır. Uygulamanız yüksek trafik alıyorsa veya CPU yoğun işlemler yapıyorsa, cluster modunu kullanmalısınız. Bu sayede gelen istekler birden fazla süreç arasında dağıtılarak uygulamanız daha ölçeklenebilir hale gelir.
3. Uygulamamı PM2 ile başlattıktan sonra sunucuyu yeniden başlatırsam ne olur?
Eğer pm2 save komutunu çalıştırıp ardından pm2 startup komutunun çıktısını uyguladıysanız, sunucunuz yeniden başlatıldığında PM2 ve onun yönettiği tüm uygulamalar otomatik olarak tekrar başlayacaktır. Bu, manuel müdahaleye gerek kalmadan sisteminizin kendiliğinden toparlanmasını sağlar ve uygulamanızın kesintisiz çalışmaya devam etmesini garantiler.
4. PM2 ile Nginx’i nasıl entegre edebilirim?
PM2 ile yönetilen Node.js uygulamaları genellikle belirli bir portta (örneğin 3000 veya 8080) çalışır ve doğrudan internete açık değildir. Nginx’i bir ters proxy olarak kullanarak, gelen HTTP/HTTPS isteklerini Nginx üzerinden bu Node.js uygulaması portuna yönlendirebilirsiniz. Bu, Nginx’in SSL/TLS sonlandırması, statik dosya sunumu ve ek güvenlik katmanları sağlamasına olanak tanır. Nginx konfigürasyonunuzda proxy_pass http://localhost:PORT_NUMARASI; şeklinde bir ayar yapmanız yeterlidir.
5. Uygulamamın loglarını PM2 ile nasıl yönetebilirim?
PM2, uygulamalarınızın standart çıktı (stdout) ve hata çıktısını (stderr) otomatik olarak yakalar. Bu logları pm2 logs uygulama_adi komutuyla görüntüleyebilirsiniz. Daha gelişmiş log yönetimi için, ecosystem.config.js dosyasında log_file, error_file ve out_file parametrelerini belirleyerek logları ayrı dosyalara yönlendirebilirsiniz. Ayrıca, pm2 install pm2-logrotate komutuyla PM2’nin kendi log rotasyon modülünü kurarak log dosyalarının belirli bir boyuta ulaştığında otomatik olarak döndürülmesini ve sıkıştırılmasını sağlayabilirsiniz, bu da disk alanınızın dolmasını engeller.