Node.js ve Express.js Ubuntu'da Deploy: PM2 ve Nginx
Ubuntu 22.04'te Node.js + Express.js uygulamasını PM2 process manager ve Nginx reverse proxy ile production'a deploy etme rehberi.
Node.js ile Web Uygulaması Deploy Nedir?
Node.js, JavaScript'i sunucu tarafında çalıştıran olay güdümlü (event-driven) ve engellenmeyen G/Ç (non-blocking I/O) modeline sahip bir çalışma ortamıdır. Express.js ise Node.js üzerine inşa edilmiş minimal ve esnek bir web uygulama çerçevesidir. Bu ikiliyi üretim ortamında çalıştırmak için PM2 process manager ve Nginx reverse proxy kullanılır.
PM2, Node.js uygulamalarını arka planda çalıştıran, crash durumunda otomatik yeniden başlatan ve cluster modunda çok çekirdekli CPU kullanımını mümkün kılan bir process yöneticisidir. Nginx ise gelen HTTP/HTTPS isteklerini Node.js uygulamasına yönlendiren, SSL terminasyonu yapan ve statik dosyaları servis eden ters proxy olarak görev yapar.
Ön Gereksinimler
- Ubuntu 22.04 LTS sunucu
- Sudo yetkili kullanıcı
- Alan adı (SSL için gerekli)
- 80 ve 443 portları açık
Adım 1: Node.js Kurulumu (NodeSource)
Ubuntu'nun varsayılan deposundaki Node.js eski olabilir. Güncel LTS sürümü için NodeSource deposunu kullanın:
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v
npm -v
Adım 2: Örnek Express.js Uygulaması Oluşturma
mkdir -p /var/www/myapp
cd /var/www/myapp
npm init -y
npm install express
nano /var/www/myapp/app.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.get('/', (req, res) => {
res.json({ message: 'Merhaba! Node.js uygulaması çalışıyor.', status: 'ok' });
});
app.get('/health', (req, res) => {
res.json({ status: 'healthy', uptime: process.uptime() });
});
app.listen(PORT, '127.0.0.1', () => {
console.log(`Sunucu http://127.0.0.1:${PORT} adresinde çalışıyor`);
});
Adım 3: PM2 Kurulumu ve Yapılandırması
sudo npm install -g pm2
Uygulamayı PM2 ile Başlatma
cd /var/www/myapp
pm2 start app.js --name "myapp"
pm2 status
pm2 logs myapp
ecosystem.config.js ile Gelişmiş Yapılandırma
nano /var/www/myapp/ecosystem.config.js
module.exports = {
apps: [{
name: 'myapp',
script: 'app.js',
instances: 'max',
exec_mode: 'cluster',
watch: false,
max_memory_restart: '1G',
env: {
NODE_ENV: 'development',
PORT: 3000
},
env_production: {
NODE_ENV: 'production',
PORT: 3000
},
log_file: '/var/log/pm2/myapp.log',
error_file: '/var/log/pm2/myapp_error.log',
merge_logs: true,
log_date_format: 'YYYY-MM-DD HH:mm:ss'
}]
};
pm2 start ecosystem.config.js --env production
pm2 save
pm2 startup systemd
PM2 startup komutunun çıktısındaki komutu root olarak çalıştırın (sudo ile).
Adım 4: Nginx Reverse Proxy Yapılandırması
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/myapp
upstream nodejs {
server 127.0.0.1:3000;
keepalive 64;
}
server {
listen 80;
server_name example.com www.example.com;
access_log /var/log/nginx/myapp_access.log;
error_log /var/log/nginx/myapp_error.log;
location / {
proxy_pass http://nodejs;
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;
}
location /static/ {
alias /var/www/myapp/public/;
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Adım 5: SSL Sertifikası (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com
Certbot otomatik olarak Nginx yapılandırmasını SSL için günceller ve her 90 günde bir yenileme için systemd timer kurar.
Adım 6: Güvenlik Duvarı Ayarları
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
# Node.js portunu dışarıya açmayın, sadece Nginx üzerinden erişim olsun
sudo ufw deny 3000
PM2 Yönetim Komutları
pm2 list # Tüm process'leri listele
pm2 restart myapp # Uygulamayı yeniden başlat
pm2 reload myapp # Zero-downtime reload
pm2 stop myapp # Durdur
pm2 delete myapp # Sil
pm2 logs myapp --lines 100 # Son 100 log satırı
pm2 monit # Anlık izleme ekranı
Sık Karşılaşılan Sorunlar
502 Bad Gateway
pm2 status
pm2 logs myapp --err
sudo systemctl status nginx
curl http://127.0.0.1:3000
Port Zaten Kullanımda
sudo lsof -i :3000
sudo kill -9 PID
Sonuç
Ubuntu 22.04 üzerinde Node.js + Express.js uygulamasını PM2 ve Nginx ile production ortamına başarıyla deploy ettiniz. PM2'nin cluster modu çok çekirdekli CPU'ları verimli kullanırken, Nginx reverse proxy SSL terminasyonu ve statik dosya servisi gibi görevleri üstlenerek Node.js sürecinizin iş yükünü azaltır.
Yorumlar
Henüz yorum yok. İlk yorumu siz yapın!