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.
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.
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.
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.
# 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
# .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, 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'yi global olarak kur
npm install -g pm2
# PM2 sürümünü kontrol et
pm2 --version
# 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
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
# 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, 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
# 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;
}
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.
# 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
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.
PM2 loglarını 'pm2 logs myapp' komutuyla inceleyin. Yaygın nedenler: eksik environment variables, port çakışması veya syntax hatası. 'pm2 monit' ile gerçek zamanlı CPU/RAM kullanımını izleyin. Bellek sızıntısı varsa 'max_memory_restart' parametresini ecosystem.config.js'e ekleyin.
Bu hata genellikle Node.js uygulamasının çalışmadığı anlamına gelir. 'pm2 status' ile uygulamanın running durumda olduğunu kontrol edin. 'pm2 logs' ile hata mesajlarını inceleyin. Nginx'in doğru porta proxy yaptığını 'sudo nginx -t' ile doğrulayın.
Her uygulama farklı bir port kullanmalıdır (3000, 3001, 3002 gibi). PM2'de her biri için ayrı isim verin. Nginx'te her domain için ayrı server bloğu oluşturun ve ilgili porta proxy yapın. Tüm uygulamalar 80/443 üzerinden Nginx aracılığıyla erişilebilir olur.
nvm ile sürüm değiştirirken dikkatli olun. Yeni sürümü kurun, uygulamanızı test edin, ardından 'nvm alias default' ile varsayılanı güncelleyin. PM2 startup scriptini de yeni Node.js yolu ile yeniden oluşturmanız gerekebilir: 'pm2 unstartup' ardından 'pm2 startup'.
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.
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 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.