Django, Python tabanlı güçlü bir web framework'üdür ve web uygulamaları geliştirmek için yaygın olarak kullanılır. Ancak, Django'nun standart geliştirme sunucusu (runserver), yalnızca geliştirme aşamasında kullanılması gereken bir araçtır. Üretim ortamında, performans, güvenlik ve ölçeklenebilirlik gibi faktörleri göz önünde bulundurarak daha güçlü bir dağıtım mimarisi tercih edilmelidir. Bu bağlamda Daphne ve Nginx kullanımı, Django uygulamalarını yüksek performansla ve güvenli bir şekilde yayına almak için popüler bir yöntemdir.
Bu makalede, Django uygulamasını Daphne (ASGI sunucusu) ve Nginx ile nasıl yapılandırarak üretim ortamında yayınlayacağınızı adım adım ele alacağız.

ASGI Nedir ve Daphne Neden Kullanılır?

Django, başlangıçta sadece WSGI'yi (Web Server Gateway Interface) destekliyordu. Ancak, Django 3.0 itibarıyla ASGI (Asynchronous Server Gateway Interface) desteği sunmaya başladı. ASGI, Django'nun WebSockets ve diğer asenkron özellikleri kullanmasını sağlar. Daphne, Django'nun ASGI arayüzünü destekleyen bir uygulama sunucusudur. Daphne, Django'nun WebSockets, asenkron görevler ve gerçek zamanlı uygulama ihtiyaçları için oldukça uygundur. Nginx ise bir ters proxy olarak kullanılarak, trafik yönetimi, güvenlik ve yük dengeleme görevlerini üstlenir.

Adım 1: Gerekli Paketleri Yükleyin

Daphne ve Nginx ile Django uygulamanızı dağıtmadan önce bazı paketlerin yüklü olması gerekir.
1.1. Daphne ve Channels Kurulumu
Django'yu ASGI ile çalıştırmak için Daphne ve Django Channels paketini yüklemeniz gerekiyor.
pip install daphne
pip install channels
Daha sonra, Django projenizde channels'ı etkinleştirin. settings.py dosyasına gidin ve şu ayarları ekleyin:
# settings.py

INSTALLED_APPS = [
    # Diğer uygulamalar
    'channels',
]

# ASGI uygulamasını tanımlayın
ASGI_APPLICATION = 'proje_adı.asgi.application'
Daha sonra proje klasörünüzde bir asgi.py dosyası oluşturun:
# asgi.py

import os
from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proje_adı.settings')

application = get_asgi_application()
Bu ayarlarla birlikte, projeniz artık ASGI destekli hale gelmiştir ve Daphne ile çalışmaya hazırdır.

Adım 2: Daphne Sunucusunu Yapılandırma

Daphne, Django uygulamanızı asenkron olarak çalıştıracak ASGI sunucusudur. Daphne'yi başlatmak için şu komutu kullanabilirsiniz:
daphne -b 0.0.0.0 -p 8001 proje_adı.asgi:application
Bu komut, Daphne'yi 8001 portu üzerinden çalıştırır ve Django projenizi ASGI üzerinden hizmete sunar. Ancak, üretim ortamında genellikle bir process manager (örn. systemd veya supervisor) kullanarak Daphne'yi sürekli çalışır halde tutmanız gerekecek.
2.1. Supervisor ile Daphne'yi Yönetmek
Supervisor, sunucu süreçlerini izlemek ve yönetmek için kullanılır. Daphne'yi supervisor ile çalıştırmak için yapılandırma dosyası oluşturun:
sudo apt install supervisor
Ardından bir Daphne konfigürasyon dosyası oluşturun:
sudo nano /etc/supervisor/conf.d/daphne.conf
Dosya içeriğini şu şekilde düzenleyin:
[program:daphne]
command=/path/to/your/venv/bin/daphne -b 0.0.0.0 -p 8001 proje_adı.asgi:application
directory=/path/to/your/project
autostart=true
autorestart=true
stderr_logfile=/var/log/daphne.err.log
stdout_logfile=/var/log/daphne.out.log
Bu yapılandırma, Daphne'yi sistem yeniden başlatıldığında otomatik olarak çalıştıracak ve hataları log dosyalarına kaydedecektir.

Adım 3: Nginx'i Ters Proxy Olarak Yapılandırma

Nginx, Daphne'nin önünde yer alarak istemciden gelen trafiği yönetir ve Daphne sunucusuna iletir. Ayrıca, statik dosyaları sunmak ve SSL terminasyonu gibi görevleri üstlenir.
3.1. Nginx Kurulumu
Eğer Nginx yüklü değilse, şu komutla yükleyebilirsiniz:
sudo apt update
sudo apt install nginx
3.2. Nginx Konfigürasyonu
Nginx'i Daphne ile kullanmak için yeni bir site yapılandırması oluşturun:
sudo nano /etc/nginx/sites-available/proje_adı
Aşağıdaki gibi bir yapılandırma ekleyin:
server {
    listen 80;
    server_name your_domain_or_ip;

    location / {
        proxy_pass http://127.0.0.1:8001;
        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;
    }

    location /static/ {
        alias /path/to/your/project/static/;
    }

    location /media/ {
        alias /path/to/your/project/media/;
    }
}
Bu konfigürasyon dosyası, http://127.0.0.1:8001 adresine (yani Daphne'ye) gelen istekleri yönlendirir. Statik ve medya dosyaları da doğrudan Nginx üzerinden sunulur.
3.3. Nginx Site Aktifleştirme
Yapılandırmayı aktifleştirmek için aşağıdaki komutları kullanın:
sudo ln -s /etc/nginx/sites-available/proje_adı /etc/nginx/sites-enabled
sudo nginx -t
sudo systemctl restart nginx
Nginx, artık Daphne'ye gelen istekleri yönlendirecektir.

Adım 4: Statik Dosyaların Yönetimi

Django'da statik dosyalar genellikle collectstatic komutu ile bir dizine toplanır ve Nginx bu dosyaları doğrudan sunar. Statik dosyaları toplamak için şu komutu çalıştırın:
python manage.py collectstatic
Bu komut, tüm statik dosyaları STATIC_ROOT'ta belirttiğiniz dizine toplar. Nginx, bu dizinden statik dosyaları sunar.

Adım 5: Güvenlik ve Performans İyileştirmeleri

5.1. SSL Sertifikası Ekleyin
Üretim ortamında güvenliği sağlamak için SSL sertifikası kullanmalısınız. Let's Encrypt gibi ücretsiz SSL sağlayıcıları kullanarak Nginx üzerinde kolayca SSL ekleyebilirsiniz. Let's Encrypt'i kullanmak için Certbot yükleyin:
sudo apt install certbot python3-certbot-nginx
Ardından, aşağıdaki komutla SSL sertifikasını alın ve yapılandırın:
sudo certbot --nginx -d your_domain
Bu işlem, SSL sertifikasını otomatik olarak yapılandıracak ve Nginx'e ekleyecektir.
5.2. Performans Optimizasyonu
- Cache: Nginx üzerinden önbellekleme yapılandırmaları ekleyerek statik içeriklerin daha hızlı sunulmasını sağlayabilirsiniz.
- Load Balancing: Nginx, birden fazla Daphne sunucusu arasında yük dengeleme yaparak uygulamanızın ölçeklenebilirliğini artırabilir.
Django uygulamanızı Daphne ve Nginx ile yayına almak, hem performans hem de güvenlik açısından oldukça güçlü bir yapı sunar. Daphne, asenkron istekleri yönetmek için ideal bir sunucuyken, Nginx ters proxy olarak trafiği yönetir, SSL terminasyonu sağlar ve statik dosyaları sunar. Bu yapı, özellikle gerçek zamanlı uygulamalar, yüksek trafik alan siteler ve WebSockets desteği gerektiren projeler için mükemmel bir çözümdür.