
Django Uygulaması İçin Sunucu Seçimi: 2026 Detaylı Rehber
Django uygulamasını paylaşımlı, VDS veya dedicated sunucuda nasıl çalıştırırsınız? Gunicorn, uWSGI, Nginx, PostgreSQL, Celery ve maliyet karşılaştırma.
Django Uygulaması İçin Sunucu Seçimi: 2026 Detaylı Rehber
Django, Python ekosisteminin en popüler web framework'ü; SaaS, dashboard, content platform ve e-ticaret uygulamalarda yaygın. PHP/Laravel'a benzer ama Python'un long-running process modeli nedeniyle hosting tarafı farklı: cPanel paylaşımlı hosting çoğunlukla uygunsuz, VDS veya dedicated önerilir.
Büyükweb Türkiye VDS Django için ideal: tam Python + sistem paketi yetkisi, Gunicorn/uWSGI process management, PostgreSQL + Redis + Celery birlikte çalıştırma esnekliği. Bu rehberde Django stack'inin tüm bileşenlerini, hangi sunucu tipinde nasıl yapılandırılacağını ve maliyet matrisini detaylı ele alıyoruz.
Django'nun Sunucu Beklentileri
| Bileşen | Versiyon (Django 5.x) | Hosting Etkisi |
|---|---|---|
| Python | 3.10+ (önerilen 3.12+) | Long-running process kapasitesi |
| WSGI Server | Gunicorn / uWSGI | Apache/nginx + WSGI module |
| ASGI Server | Uvicorn / Daphne | Async Django (channels) |
| Database | PostgreSQL 15+ (önerilen) | Lokal mı remote mı? |
| Redis | 6+ | Cache, session, Celery broker |
| Celery | 5+ | Async task queue |
| Process Manager | systemd / supervisor | Worker management |
| Reverse Proxy | nginx | Static files + SSL termination |
| Static Files | WhiteNoise / S3 / nginx | Production serve |
Django Python interpreter long-running olarak çalışır; bu yüzden cPanel'in CGI tabanlı PHP modeline uymaz.
cPanel Paylaşımlı Hosting'de Django?
Çoğu cPanel sağlayıcısı Python uygulama desteği sağlar — Passenger veya Phusion Passenger üzerinden.
Büyükweb cPanel hosting cPanel'in Setup Python App özelliği:
- cPanel → Setup Python App → Create Application
- Python Version: 3.10 / 3.11 / 3.12 (mevcut)
- App Root:
/home/user/django-app - App URL:
example.com - App Startup:
passenger_wsgi.py
# passenger_wsgi.py
import sys, os
sys.path.insert(0, os.path.dirname(__file__))
from myproject.wsgi import application
Sınırlamalar
- ✗ Celery worker zor (background process)
- ✗ Redis genelde yok (paylaşımlı)
- ✗ PostgreSQL bazen yok (MySQL var)
- ✗ Long-running async (WebSocket, ASGI) sınırlı
- ✗ Pip kurulum ek paketler için sudo yok
Verdict: Küçük basit Django (blog, admin paneli) için OK. Yüksek trafik veya Celery + Channels için VDS önerilir.
Bunun temel nedeni kaynak izolasyonu: paylaşımlı hosting'de CPU ve RAM aynı fiziksel sunucudaki yüzlerce hesap arasında paylaşılır, "noisy neighbor" (gürültülü komşu) etkisiyle Django worker'ları CPU steal time yaşayabilir ve response süreleri öngörülemez hale gelir. VDS'te ise ayrılan vCPU ve RAM kaynağı yalnızca sizin uygulamanıza aittir; bu da Gunicorn worker'larının ve Celery task'larının stabil, öngörülebilir performans göstermesini sağlar.
Senaryo 1: Küçük Django App (Blog, Portfolio)
Trafik: <500 viz/gün
Özellikler: User auth, basit CMS, statik sayfalar
cPanel ile (Mümkün ama Sınırlı)
- ✓ Python 3.12 + Passenger
- ✓ MySQL/MariaDB
- ✗ PostgreSQL yok
- ✗ Redis yok
- ✗ Celery zor
VDS ile (Önerilen)
Büyükweb Başlangıç VDS — 2 GB RAM, 2 vCPU:
- ✓ Tam Python yetkisi
- ✓ PostgreSQL lokal
- ✓ Redis lokal
- ✓ systemd/supervisor
Maliyet: ₺250-400/ay
Senaryo 2: Orta Ölçek SaaS / Dashboard
Trafik: 500-10K viz/gün
Özellikler: Multi-tenant, async tasks (email, PDF, ETL), real-time
Önerilen: VDS Performans
Büyükweb VDS Performans: 4 GB RAM, 4 vCPU, 80 GB NVMe.
Stack
Ubuntu 24.04 LTS
├── nginx (reverse proxy + static + SSL)
├── Gunicorn (WSGI, 4-8 workers)
├── Daphne (ASGI, channels için)
├── PostgreSQL 16
├── Redis 7
├── Celery worker (4-8 process)
├── Celery beat (scheduler)
├── systemd (process manager)
└── Certbot (Let's Encrypt)
Senaryo 3: Yüksek Trafik / Kurumsal SaaS
Trafik: 50K+ viz/gün
Özellikler: Multi-tenant mimari, yoğun Celery kuyruğu, ayrı worker havuzları, yüksek eşzamanlı bağlantı
Bu ölçekte tek sunucu üzerinde web + worker + database birlikte çalıştırmak darboğaz yaratabilir. Önerilen yaklaşım bileşen ayrıştırma:
- Web/App katmanı: Büyükweb VDS Pro veya Dedicated Sunucu — Gunicorn/Daphne
- Database: Ayrı VDS'te PostgreSQL, yüksek IOPS NVMe disk
- Celery worker havuzu: Ayrı VDS, CPU-yoğun task'lar için bağımsız ölçeklenebilir
- Redis: Ayrı instance, cache ve broker ayrımı (
db=0cache,db=1broker)
Bu mimaride her bileşen bağımsız ölçeklenebilir; database I/O yükü web trafiğini etkilemez, Celery worker'ları web response time'ını bozmaz. Büyükweb Dedicated Sunucu yoğun database workload'ı için tüm fiziksel kaynağın tek uygulamaya ayrılmasını sağlar.
Maliyet: ₺1.500-3.000/ay (bileşen sayısına göre)
Adım Adım Production Setup
Sistem Hazırlık
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3.12 python3.12-venv python3-pip nginx postgresql redis-server git
Database
sudo -u postgres psql
CREATE DATABASE myproject;
CREATE USER myuser WITH PASSWORD 'STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE myproject TO myuser;
\q
Django Project Setup
sudo adduser deploy
sudo su - deploy
cd /home/deploy
git clone https://github.com/USER/myproject.git
cd myproject
python3.12 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install gunicorn psycopg2-binary
# settings.py production değerleri
cat > .env <<EOF
DEBUG=False
SECRET_KEY=$(python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())')
DATABASE_URL=postgres://myuser:STRONG_PASSWORD@localhost:5432/myproject
ALLOWED_HOSTS=app.example.com
EOF
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py createsuperuser
Gunicorn systemd Service
/etc/systemd/system/myproject.service:
[Unit]
Description=Django Gunicorn
After=network.target postgresql.service redis.service
[Service]
Type=notify
User=deploy
Group=deploy
WorkingDirectory=/home/deploy/myproject
ExecStart=/home/deploy/myproject/venv/bin/gunicorn \
--workers 4 \
--bind 127.0.0.1:8000 \
--access-logfile /var/log/gunicorn/access.log \
--error-logfile /var/log/gunicorn/error.log \
myproject.wsgi:application
Restart=always
[Install]
WantedBy=multi-user.target
sudo mkdir -p /var/log/gunicorn
sudo chown deploy:deploy /var/log/gunicorn
sudo systemctl daemon-reload
sudo systemctl enable --now myproject.service
sudo systemctl status myproject
nginx Reverse Proxy
/etc/nginx/sites-available/myproject:
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
client_max_body_size 50M;
location /static/ {
alias /home/deploy/myproject/staticfiles/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /home/deploy/myproject/media/;
}
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
SSL (Let's Encrypt)
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com
Celery Async Tasks
Celery Worker Service
/etc/systemd/system/myproject-celery.service:
[Unit]
Description=Celery Worker
After=network.target redis.service
[Service]
Type=forking
User=deploy
Group=deploy
WorkingDirectory=/home/deploy/myproject
Environment="PATH=/home/deploy/myproject/venv/bin"
ExecStart=/home/deploy/myproject/venv/bin/celery -A myproject worker --detach \
--loglevel=info --logfile=/var/log/celery/worker.log \
--pidfile=/var/run/celery/worker.pid \
--concurrency=4
Restart=always
[Install]
WantedBy=multi-user.target
Celery Beat (Scheduler)
/etc/systemd/system/myproject-celerybeat.service:
[Service]
ExecStart=/home/deploy/myproject/venv/bin/celery -A myproject beat \
--loglevel=info \
--schedule=/var/lib/celery/beat-schedule
sudo systemctl daemon-reload
sudo systemctl enable --now myproject-celery myproject-celerybeat
Django Settings
# settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Europe/Istanbul'
# Periodic tasks (Celery Beat)
CELERY_BEAT_SCHEDULE = {
'cleanup-old-records': {
'task': 'myapp.tasks.cleanup',
'schedule': crontab(hour=3, minute=0), # Her gece 03:00
},
}
ASGI / Django Channels (WebSocket)
Real-time uygulama (chat, notifications) için Django Channels + Daphne:
pip install channels[daphne] channels-redis
# settings.py
INSTALLED_APPS = [..., 'daphne', 'channels']
ASGI_APPLICATION = 'myproject.asgi.application'
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {'hosts': [('127.0.0.1', 6379)]},
},
}
/etc/systemd/system/myproject-daphne.service:
[Service]
ExecStart=/home/deploy/myproject/venv/bin/daphne \
-b 127.0.0.1 -p 8001 \
myproject.asgi:application
nginx config:
location /ws/ {
proxy_pass http://127.0.0.1:8001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
Deployment Pipeline
Manual Deploy Script
#!/bin/bash
# /home/deploy/myproject/deploy.sh
set -e
cd /home/deploy/myproject
git pull origin main
source venv/bin/activate
pip install -r requirements.txt --upgrade
python manage.py migrate
python manage.py collectstatic --noinput
sudo systemctl restart myproject
sudo systemctl restart myproject-celery
sudo systemctl reload nginx
echo "Deploy complete"
CI/CD (GitHub Actions)
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH Deploy
uses: appleboy/ssh-action@v1
with:
host: \${{ secrets.VDS_HOST }}
username: deploy
key: \${{ secrets.SSH_KEY }}
script: |
cd /home/deploy/myproject
./deploy.sh
Performans Optimizasyonu
Gunicorn Worker Sayısı
Formula: (2 × CPU cores) + 1. 4 vCPU VDS için 9 worker.
| Worker Tipi | Kullanım Senaryosu | Notlar |
|---|---|---|
| sync (varsayılan) | CPU-yoğun, basit request | Basit, stabil; I/O bloklarsa yavaşlar |
| gevent | Çok sayıda eşzamanlı I/O (DB, dış API çağrısı) | pip install gevent, --worker-class gevent |
| uvicorn.workers.UvicornWorker | Async view / ASGI destekli Django | Django 4.1+ async view'lar için uygun |
Gevent worker kullanırken --worker-connections parametresi eşzamanlı bağlantı sayısını belirler: gunicorn --worker-class gevent --workers 4 --worker-connections 1000 myproject.wsgi:application.
PostgreSQL Connection Pool
pip install psycopg2-binary
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'CONN_MAX_AGE': 60, # Connection pool
...
}
}
Yüksek concurrency için PgBouncer:
sudo apt install pgbouncer
Cache (Redis)
# settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.redis.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/2',
}
}
Static Files: WhiteNoise
pip install whitenoise
# settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
WhiteNoise CDN'e ihtiyaç olmadan static asset'ları gzip + cache header ile servis eder.
S3/B2 ile Media
Büyük media dosyaları için django-storages:
pip install django-storages boto3
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_STORAGE_BUCKET_NAME = 'my-media-bucket'
AWS_S3_ENDPOINT_URL = 'https://s3.eu-central-003.backblazeb2.com'
Yedekleme ve İzleme
Otomatik Yedekleme
Büyükweb VDS paketlerinde günlük otomatik yedekleme dahildir; sunucu seviyesinde disk snapshot alınır. Bu işletim sistemi ve dosya sistemi seviyesinde koruma sağlar ama veritabanı tutarlılığı için ek önlem almak iyi pratiktir:
# /etc/cron.d/pg-backup
0 2 * * * deploy pg_dump -U myuser myproject | gzip > /home/deploy/backups/db-$(date +\%Y\%m\%d).sql.gz
14 günden eski dosyaları otomatik temizlemek için:
find /home/deploy/backups -name "*.sql.gz" -mtime +14 -delete
Bu script, sunucu seviyesindeki günlük otomatik yedeğe ek olarak uygulama tutarlı (application-consistent) bir veritabanı dump'ı üretir; migration hatası veya veri bozulması durumunda hızlı geri dönüş imkânı sağlar.
Log Yönetimi ve Hata İzleme
Production Django'da üç log kaynağı düzenli takip edilmeli: Gunicorn access/error log, nginx log, Django application log.
# settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'file': {
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/var/log/django/app.log',
'maxBytes': 10 * 1024 * 1024,
'backupCount': 5,
},
},
'root': {'handlers': ['file'], 'level': 'WARNING'},
}
Hata izleme için Sentry entegrasyonu yaygın bir tercih:
pip install sentry-sdk
import sentry_sdk
sentry_sdk.init(dsn="https://xxx@sentry.io/xxx", traces_sample_rate=0.1)
Bu sayede 500 hataları anlık bildirim olarak gelir, production'da debug süresi kısalır.
Maliyet Karşılaştırma (Aylık)
| Senaryo | Ölçek | Maliyet (₺) |
|---|---|---|
| Küçük blog | <500 viz/gün | 250 (VDS Başlangıç) |
| Orta SaaS | 5K viz/gün | 400-600 (VDS Performans) |
| Yüksek SaaS | 50K+ | 1.500-3.000 (VDS Pro / Dedicated) |
Büyükweb VDS TL bazlı stabil maliyet sunar.
Yaygın Sorunlar
| Sorun | Çözüm |
|---|---|
| 502 Bad Gateway | Gunicorn ölmüş; systemctl status myproject |
| Static files 404 | collectstatic çalıştırıldı mı? nginx alias doğru mu? |
| Database connection refused | PostgreSQL açık mı? /etc/postgresql/16/main/pg_hba.conf |
| Celery task pending | Worker çalışıyor mu? Redis bağlantı? |
| CORS hatası | django-cors-headers + ALLOWED_HOSTS |
| CSRF fail | CSRF_TRUSTED_ORIGINS ayarla |
| Memory leak | Gunicorn --max-requests=1000 worker recycle |
| Slow query | django-debug-toolbar veya pg_stat_statements |
| SSL yenileme başarısız | certbot renew --dry-run ile test et; nginx'in 80 portu açık mı kontrol et |
| Migration çakışması | python manage.py showmigrations ile durumu incele, gerekirse --fake ile senkronize et |
Sıkça Sorulan Sorular
cPanel paylaşımlı hosting Django için yeterli mi?
Çok küçük site için OK; orta+ üzeri için VDS gerekli. Celery, PostgreSQL, Redis sahibi olmak isteyen herkes VDS'e geçmeli.
Heroku alternatifi olarak Türkiye VDS kullanabilir miyim?
Evet — daha düşük maliyet + KVKK uyumu + TL stabilite. Heroku-like deploy için Dokku (open-source mini-Heroku) VDS'e kurulabilir.
Hangi Python versiyonu?
Python 3.12 önerilir (Django 5.1+ tam destekli). 3.13 çok yeni, ekosistem henüz tam değil.
PostgreSQL vs MySQL Django için?
Django PostgreSQL ile daha iyi entegre (JSONField, ArrayField, CITEXT, full-text search). MySQL alternatif ama PostgreSQL endüstri standardı.
uWSGI vs Gunicorn?
Gunicorn daha popüler + daha basit; uWSGI daha hızlı ama config karmaşık. Gunicorn modern Django için yeterli.
Docker'da Django çalıştırmalıyım mı?
Lokal dev + CI test için ideal. Production'da direkt VDS'te çalıştırmak daha basit; orchestration ihtiyacı varsa Docker Compose veya Kubernetes.
CI/CD için ücretsiz seçenek?
GitHub Actions (private repo'larda 2000 dk/ay free); GitLab CI (5GB compute free). Hosting Türkiye'de olsa bile CI runner globaldir.
VDS'te güvenlik duvarı (firewall) nasıl ayarlanır?
Ubuntu'da ufw ile temel kurallar yeterli:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
PostgreSQL (5432) ve Redis (6379) portları dışarıya kapalı tutulmalı; sadece 127.0.0.1 üzerinden erişilebilir olmalı. postgresql.conf içinde listen_addresses = 'localhost' ayarı bunu garanti eder.
Django admin panelini nasıl güvenli hale getiririm?
Production'da varsayılan /admin/ yolunu değiştirmek (ör. path('yonetim-paneli-x7f2/', admin.site.urls)), güçlü parola politikası uygulamak ve mümkünse IP whitelist (nginx allow/deny direktifi) eklemek önerilir. Ayrıca DEBUG=False production'da kesinlikle zorunlu — açık kalırsa hassas stack trace bilgisi dışarı sızabilir.
VDS'te ne kadar disk alanı yeterli?
Django kod + venv genelde birkaç yüz MB yer kaplar; asıl alan ihtiyacı PostgreSQL veritabanı büyüklüğü ve media/upload dosyalarına göre değişir. Küçük/orta ölçek için 50-80 GB NVMe genelde yeterli; kullanıcı yüklemesi yoğun uygulamalarda Büyükweb VDS paketlerinde disk boyutu yükseltilebilir veya media, S3 uyumlu nesne depolamaya taşınabilir.
İlgili Rehberler
- Laravel İçin Hosting Seçimi 2026
- PostgreSQL Kurulumu Temel Yönetim
- PostgreSQL Performans VACUUM
- Nginx Web Sunucusu Kurulumu
- Türkiye VDS Sunucu
İlgili Büyükweb Hizmetleri
Django uygulamanız için Türkiye lokasyonlu Büyükweb hizmetleri:
Sorularınız için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.
Web Hosting Rehberi İlgili Hizmetlerimiz
Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin
Etiketler:



