Node.js Uygulaması Deploy Etme: PM2 ve Nginx
Node.js uygulamasını VPS'e deploy etme rehberi. nvm ile Node.js kurulumu, PM2 process manager, Nginx reverse proxy, SSL sertifikası ve environment variables yönetimi.
İçindekiler
Node.js Uygulaması Deploy Etme: PM2 ve Nginx Rehberi
Node.js uygulamalarını üretim ortamına deploy etmek, doğru araçlar ve yapılandırma ile oldukça sistematik bir süreçtir. Bu rehberde nvm ile Node.js kurulumundan PM2 process manager kullanımına, Nginx reverse proxy yapılandırmasından SSL sertifikası kurulumuna kadar tüm adımları ele alacağız.
Node.js Kurulumu (nvm ile)
nvm (Node Version Manager), birden fazla Node.js sürümünü yönetmenizi sağlar ve üretim ortamları için önerilir.
# nvm kurulum scriptini indir ve çalıştır
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
# Shell'i yeniden yükle
source ~/.bashrc
# nvm sürümünü kontrol et
nvm --version
# En son LTS sürümünü kur
nvm install --lts
# Belirli bir sürüm kur
nvm install 20.11.0
# Varsayılan sürümü ayarla
nvm use --lts
nvm alias default node
# Node.js ve npm sürümlerini kontrol et
node --version
npm --version
Üretim ortamında her zaman LTS (Long Term Support) sürümünü kullanın. LTS sürümleri daha uzun süre güvenlik güncellemesi alır.
Uygulamayı Sunucuya Aktarma
Git ile Klonlama
# Uygulama dizini oluştur
sudo mkdir -p /var/www/myapp
sudo chown $USER:$USER /var/www/myapp
# Repoyu klonla
cd /var/www
git clone https://github.com/kullanici/myapp.git
cd myapp
# Bağımlılıkları kur (üretim için)
npm install --production
# veya tüm bağımlılıkları kur
npm install
Environment Variables (.env)
# .env dosyası oluştur
nano /var/www/myapp/.env
NODE_ENV=production
PORT=3000
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=gizli-anahtar-buraya
REDIS_URL=redis://localhost:6379
# .env dosyasını güvenli hale getir
chmod 600 /var/www/myapp/.env
.env dosyasını asla Git reposuna eklemeyin. .gitignore dosyanıza .env satırını ekleyin.
PM2 Process Manager
PM2, Node.js uygulamalarını üretim ortamında yönetmek için en popüler araçtır. Otomatik yeniden başlatma, log yönetimi ve cluster modu gibi özellikler sunar.
PM2 Kurulumu
# PM2'yi global olarak kur
npm install -g pm2
# PM2 sürümünü kontrol et
pm2 --version
Uygulamayı PM2 ile Başlatma
# Basit başlatma
pm2 start app.js --name myapp
# Belirli bir port ile
pm2 start app.js --name myapp -- --port 3000
# npm start komutu ile
pm2 start npm --name myapp -- start
# Cluster modu (CPU çekirdek sayısı kadar instance)
pm2 start app.js --name myapp -i max
# Belirli sayıda instance
pm2 start app.js --name myapp -i 4
PM2 Ecosystem Dosyası
Daha gelişmiş yapılandırma için ecosystem.config.js dosyası kullanın:
nano /var/www/myapp/ecosystem.config.js
module.exports = {
apps: [
{
name: 'myapp',
script: './app.js',
instances: 'max',
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
error_file: '/var/log/pm2/myapp-error.log',
out_file: '/var/log/pm2/myapp-out.log',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
max_memory_restart: '500M',
watch: false,
autorestart: true
}
]
};
# Ecosystem dosyası ile başlat
pm2 start ecosystem.config.js --env production
# PM2 temel komutlar
pm2 list # Çalışan uygulamaları listele
pm2 status # Durum özeti
pm2 logs myapp # Logları görüntüle
pm2 logs myapp --lines 100 # Son 100 satır log
pm2 restart myapp # Yeniden başlat
pm2 reload myapp # Sıfır downtime ile yeniden yükle
pm2 stop myapp # Durdur
pm2 delete myapp # Sil
pm2 monit # Gerçek zamanlı izleme
PM2 Sistem Başlangıcında Otomatik Başlatma
# Startup script oluştur
pm2 startup
# Çıktıdaki komutu çalıştır (örnek):
sudo env PATH=$PATH:/home/user/.nvm/versions/node/v20.11.0/bin pm2 startup systemd -u user --hp /home/user
# Mevcut PM2 listesini kaydet
pm2 save
Nginx Reverse Proxy Yapılandırması
Nginx, Node.js uygulamanızın önünde reverse proxy olarak çalışarak SSL sonlandırma, statik dosya sunumu ve yük dengeleme sağlar.
# Nginx kur
sudo apt update
sudo apt install nginx -y
# Yapılandırma dosyası oluştur
sudo nano /etc/nginx/sites-available/myapp
server {
listen 80;
server_name example.com www.example.com;
# Statik dosyalar için (opsiyonel)
location /static/ {
alias /var/www/myapp/public/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location / {
proxy_pass http://localhost:3000;
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_cache_bypass $http_upgrade;
proxy_read_timeout 86400;
}
}
# Siteyi etkinleştir
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
# Yapılandırmayı test et
sudo nginx -t
# Nginx'i yeniden yükle
sudo systemctl reload nginx
SSL Sertifikası (Let's Encrypt)
# Certbot kur
sudo apt install certbot python3-certbot-nginx -y
# SSL sertifikası al
sudo certbot --nginx -d example.com -d www.example.com
# Otomatik yenilemeyi test et
sudo certbot renew --dry-run
Certbot, Nginx yapılandırmanızı otomatik olarak HTTPS için günceller:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
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_cache_bypass $http_upgrade;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
Deployment Workflow
Güncellemeleri deploy etmek için basit bir workflow:
# Yeni kodu çek
cd /var/www/myapp
git pull origin main
# Bağımlılıkları güncelle
npm install --production
# Veritabanı migration (varsa)
npm run migrate
# PM2 ile sıfır downtime yeniden başlatma
pm2 reload myapp
# Logları kontrol et
pm2 logs myapp --lines 50
REXE sunucularında Path Panel üzerinden 3000 portunu kapatabilirsiniz. Nginx 80/443 portlarından trafiği yönlendireceği için Node.js uygulamanızın portuna dışarıdan erişim gerekmez.
Firewall Ayarları
# ufw ile gerekli portları aç
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
# Node.js portunu dışarıya kapatın (Nginx üzerinden erişilecek)
# sudo ufw deny 3000/tcp
Sonuç
Node.js uygulamanız artık PM2 ile yönetilen, Nginx reverse proxy arkasında çalışan ve SSL ile güvenli hale getirilmiş bir üretim ortamında çalışıyor. PM2'nin cluster modu ile CPU çekirdeklerini tam verimlilikle kullanabilir, pm2 reload komutu ile sıfır downtime güncellemeler yapabilirsiniz.
İlgili Makaleler
PHP Uygulaması Deploy Etme: LAMP ve LEMP Stack
PHP uygulamasını VPS'e deploy etme rehberi. LAMP ve LEMP stack karşılaştırması, Apache/Nginx + PHP-FPM + MySQL kurulumu, sanal host yapılandırması ve PHP sürüm yönetimi.
WordPress Kurulumu ve Optimizasyonu: VPS Rehberi
VPS'te WordPress kurulumu ve optimizasyonu rehberi. LEMP stack, wp-config.php ayarları, dosya izinleri, SSL, OPcache performans optimizasyonu ve güvenlik sertleştirme.
Python/Django Deploy: Gunicorn ve Nginx ile Üretim
Python/Django uygulamasını VPS'e deploy etme rehberi. Virtualenv kurulumu, Django üretim ayarları, Gunicorn WSGI sunucusu, Nginx reverse proxy, systemd servisi ve statik dosya yönetimi.