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.
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.
Django, Python'un en popüler web framework'üdür. Üretim ortamına deploy etmek için Gunicorn (WSGI sunucusu) ve Nginx (reverse proxy) kombinasyonu endüstri standardıdır. Bu rehberde sıfırdan Django uygulamanızı VPS'e deploy etmeyi öğreneceksiniz.
# Sistem güncellemesi
sudo apt update && sudo apt upgrade -y
# Python 3 ve pip kur
sudo apt install python3 python3-pip python3-venv python3-dev -y
# Python sürümünü kontrol et
python3 --version
pip3 --version
# Uygulama dizini oluştur
sudo mkdir -p /var/www/mydjango
sudo chown $USER:$USER /var/www/mydjango
cd /var/www/mydjango
# Virtual environment oluştur
python3 -m venv venv
# Virtual environment'ı aktifleştir
source venv/bin/activate
# pip'i güncelle
pip install --upgrade pip
Her Django projesi için ayrı bir virtual environment kullanın. Bu, bağımlılık çakışmalarını önler ve projeleri izole eder.
# Repoyu klonla
cd /var/www
git clone https://github.com/kullanici/mydjango.git
cd mydjango
# Virtual environment oluştur ve aktifleştir
python3 -m venv venv
source venv/bin/activate
# Bağımlılıkları kur
pip install -r requirements.txt
# Gunicorn kur
pip install gunicorn
# .env dosyası oluştur
nano /var/www/mydjango/.env
DJANGO_SECRET_KEY=cok-gizli-ve-uzun-bir-anahtar-buraya
DJANGO_DEBUG=False
DJANGO_ALLOWED_HOSTS=example.com,www.example.com
DATABASE_URL=postgresql://dbuser:dbpass@localhost:5432/mydb
REDIS_URL=redis://localhost:6379/0
# settings/production.py veya settings.py içinde
import os
from pathlib import Path
# Güvenlik
DEBUG = False
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
ALLOWED_HOSTS = os.environ.get('DJANGO_ALLOWED_HOSTS', '').split(',')
# Güvenlik başlıkları
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Statik dosyalar
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# Logging
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'level': 'ERROR',
'class': 'logging.FileHandler',
'filename': '/var/log/django/error.log',
},
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'ERROR',
'propagate': True,
},
},
}
# PostgreSQL kur
sudo apt install postgresql postgresql-contrib -y
# PostgreSQL'e bağlan
sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER dbuser WITH PASSWORD 'guclu-sifre';
ALTER ROLE dbuser SET client_encoding TO 'utf8';
ALTER ROLE dbuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE dbuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydb TO dbuser;
\q
# psycopg2 kur
pip install psycopg2-binary
# Migration çalıştır
python manage.py migrate
# Superuser oluştur
python manage.py createsuperuser
# Statik dosyaları topla
python manage.py collectstatic --noinput
# Gunicorn'u test et
cd /var/www/mydjango
source venv/bin/activate
gunicorn --bind 0.0.0.0:8000 myproject.wsgi:application
# Gunicorn yapılandırma dosyası
nano /var/www/mydjango/gunicorn.conf.py
# gunicorn.conf.py
bind = 'unix:/run/gunicorn/gunicorn.sock'
workers = 3 # (2 * CPU çekirdeği) + 1
worker_class = 'sync'
worker_connections = 1000
timeout = 30
keepalive = 2
max_requests = 1000
max_requests_jitter = 50
preload_app = True
user = 'www-data'
group = 'www-data'
errorlog = '/var/log/gunicorn/error.log'
accesslog = '/var/log/gunicorn/access.log'
loglevel = 'info'
# Log dizinleri oluştur
sudo mkdir -p /var/log/gunicorn /run/gunicorn
sudo chown www-data:www-data /var/log/gunicorn /run/gunicorn
# Systemd servis dosyası oluştur
sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=Gunicorn daemon for Django
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/var/www/mydjango
ExecStart=/var/www/mydjango/venv/bin/gunicorn \
--config /var/www/mydjango/gunicorn.conf.py \
myproject.wsgi:application
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
EnvironmentFile=/var/www/mydjango/.env
[Install]
WantedBy=multi-user.target
# Servisi etkinleştir ve başlat
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn
sudo nano /etc/nginx/sites-available/mydjango
server {
listen 80;
server_name example.com www.example.com;
# Statik dosyalar
location /static/ {
alias /var/www/mydjango/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
# Medya dosyaları
location /media/ {
alias /var/www/mydjango/media/;
}
# Gunicorn'a proxy
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn/gunicorn.sock;
proxy_read_timeout 300;
proxy_connect_timeout 300;
}
client_max_body_size 100M;
access_log /var/log/nginx/mydjango.access.log;
error_log /var/log/nginx/mydjango.error.log;
}
sudo ln -s /etc/nginx/sites-available/mydjango /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com
# Güncellemeleri deploy et
cd /var/www/mydjango
source venv/bin/activate
git pull origin main
pip install -r requirements.txt
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart gunicorn
REXE sunucularında Django için en az 1 GB RAM önerilir. Gunicorn worker sayısını CPU çekirdeği sayısına göre ayarlayın: (2 × CPU) + 1.
Django uygulamanız artık Gunicorn WSGI sunucusu ve Nginx reverse proxy ile üretim ortamında çalışıyor. Systemd servisi sayesinde sunucu yeniden başladığında uygulama otomatik olarak başlar.
'sudo systemctl status gunicorn' ile servis durumunu kontrol edin. 'sudo journalctl -u gunicorn -n 50' ile son logları inceleyin. Yaygın nedenler: yanlış WSGI modül yolu, eksik bağımlılıklar veya .env dosyasındaki hatalı değerler. Virtual environment'ın doğru yolda olduğunu kontrol edin.
'python manage.py collectstatic' komutunu çalıştırdığınızdan emin olun. Nginx'te /static/ location bloğunun STATIC_ROOT dizinine doğru alias yaptığını kontrol edin. settings.py'de STATIC_ROOT değerinin doğru ayarlandığını doğrulayın. Nginx'in www-data kullanıcısı olarak staticfiles dizinine erişebildiğini kontrol edin.
settings.py'de DEBUG=True yaparak hata detaylarını görün (sadece geliştirme ortamında). Gunicorn loglarını 'sudo journalctl -u gunicorn' ile inceleyin. Django log dosyasını kontrol edin (/var/log/django/error.log). Veritabanı bağlantısını ve migration durumunu kontrol edin.
Her uygulama için ayrı virtual environment, ayrı Gunicorn socket dosyası ve ayrı systemd servis dosyası oluşturun. Nginx'te her domain için ayrı server bloğu ve ilgili Gunicorn socket'ine proxy yapılandırması ekleyin. Her uygulamanın farklı bir veritabanı kullandığından emin olun.
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.
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.