metin oktay deniz

m e t i n

Yükleniyor

Django’da Nginx, Gunicorn & Uvicorn Rehberi
Yayınlanma Tarihi

21 Nisan 2025

Nginx, Gunicorn, Uvicorn, ASGI & WSGI ile Django Üretim Ortamı

Projelerimi canlıya alırken kullanıcıya hızlı, güvenilir bir deneyim sunmak için Nginx’i ters proxy olarak, Gunicorn’u WSGI sunucusu olarak ve Uvicorn’u ASGI sunucusu olarak kullanıyorum. Ayrıca WSGI ile ASGI arasındaki farkları ve hangi senaryoda hangisini tercih ettiğimi kendi deneyimlerim üzerinden anlatmak istiyorum.

Nginx

Nginx’i genellikle şöyle kullanıyorum:

  • Statik dosya servisi: CSS, JS, resim dosyalarını doğrudan Nginx’den sunuyorum.
  • Ters proxy & yük dengeleme: İstekleri Gunicorn veya Uvicorn arka uç servisine yönlendiriyorum.
server {
    listen 80;
    server_name example.com www.example.com;

    location /static/ {
        alias /home/metin/myproject/static/;
    }

    location /media/ {
        alias /home/metin/myproject/media/;
    }

    location / {
        proxy_pass http://unix:/run/myproject.sock;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Gunicorn (WSGI)

WSGI protokolü ile senkron Django uygulamalarını çalıştırmak için:

pip install gunicorn

gunicorn myproject.wsgi:application \
    --bind unix:/run/myproject.sock \
    --workers 3 \
    --timeout 30

Burada --workers isteğe göre ayarlanır; CPU çekirdeği sayısının 2–4 katı genellikle iyi bir başlangıç.

Uvicorn (ASGI)

ASGI protokolünü destekleyen (örn. Django Channels, Starlette, FastAPI) uygulamalar için:

pip install uvicorn

uvicorn myproject.asgi:application \
    --uds /run/myproject_asgi.sock \
    --workers 3 \
    --loop uvloop \
    --http httptools

ASGI ile WebSocket, long-polling gibi asenkron özellikleri rahatça kullanabiliyorum.

WSGI vs ASGI

  • WSGI: Senkron, klasik Django için ideal. Basit CRUD uygulamalarında düşük ek yapılandırma gerektirir.
  • ASGI: Asenkron, WebSocket ve background task kullanımını destekler. Django Channels ile chat, bildirim gibi gerçek zamanlı özellikler için vazgeçilmez.

Systemd ile Servis Yönetimi

Üretimde bu sunucuları daima systemd ile daemon olarak çalıştırıyorum. Örnek Gunicorn servisi:

[Unit]
Description=gunicorn daemon for myproject
After=network.target

[Service]
User=metin
Group=www-data
WorkingDirectory=/home/metin/myproject
ExecStart=/home/metin/.venv/bin/gunicorn \
    --workers 3 \
    --bind unix:/run/myproject.sock \
    myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Sonuç

Bu kombinasyonla, Nginx’in yetenekli statik dosya ve proxy yönetimini, Gunicorn’un stabil WSGI desteğini ve Uvicorn’un modern ASGI performansını bir araya getirmiş oluyorum. Hangi protokolün projenize uygun olduğuna göre WSGI veya ASGI sunucusunu seçip, arkasına Nginx’i yerleştirerek hem hız hem ölçeklenebilirlik kazanıyorum.

— Metin Oktay Deniz