WSGI ve ASGI Nedir? Temel Kavramların Açıklaması

Python dünyasında web uygulamaları iki ana protokol üzerinden çalışır: WSGI (Web Server Gateway Interface) ve ASGI (Asynchronous Server Gateway Interface). WSGI, 2003 yılında PEP 3333 ile standartlaştırılmış ve senkron (blocking) bir model sunar. Bu modelde her istek, tek bir iş parçacığı (thread) ya da süreç (process) tarafından işlenir ve yanıt verilir. Bu yapı, Django, Flask gibi klasik framework’lerde sorunsuz çalışır.
ASGI ise modern, asenkron ihtiyaçları karşılamak için tasarlanmıştır. WebSocket, HTTP/2 ve uzun vadeli bağlantılar gibi senkron olmayan senaryoları destekler. FastAPI, Starlette ve Django’nun async özellikleri ASGI üzerinden çalışır. ASGI, aynı anda binlerce bağlantıyı tek bir olay döngüsü (event loop) içinde yöneterek %40‑%70 daha düşük gecikme ve 3 kat daha yüksek istek kapasitesi sağlayabilir.
Gunicorn Nedir? WSGI Sunucusu Olarak Temel Özellikleri
Gunicorn (Green Unicorn), Python WSGI uygulamalarını çalıştırmak için popüler bir pre‑fork modeline sahip sunucudur. Çekirdek mimarisi, ana süreçten birden çok işçi (worker) süreci oluşturarak istekleri paralel işler. Bu sayede CPU çekirdek sayısına göre ölçeklenebilir ve yüksek trafik altında %95’e varan yanıt başarı oranı elde edilir.
Gunicorn’un en büyük avantajlarından biri konfigürasyonunun basitliğidir. Tek bir komutla gunicorn myapp:wsgi çalıştırmak yeterlidir. Ayrıca gevent, eventlet gibi asenkron worker tipleri de desteklenir, bu da WSGI uygulamalarını kısmen async hale getirir. Ancak tam asenkron özellikler için ASGI sunucularına geçmek gerekir.
Uvicorn Nedir? ASGI Sunucusu Olarak Temel Özellikleri
Uvicorn, yüksek performanslı bir ASGI sunucusudur ve uvloop (libuv tabanlı) ve httptools (C tabanlı) gibi hızlandırıcıları kullanır. Bu sayede aynı donanımda Gunicorn’dan %2‑3 kat daha fazla istek işleyebilir. Uvicorn, WebSocket ve HTTP/2 desteği sunar; bu da gerçek zamanlı uygulamalar için kritik bir avantajdır.
Uvicorn’un bir diğer güçlü yönü, Docker ve Kubernetes ortamlarına entegrasyonunun sorunsuz olmasıdır. uvicorn app:app --host 0.0.0.0 --port 8000 komutu, bir konteyner içinde hızlıca çalıştırılabilir. Ayrıca --workers parametresiyle çoklu işçi süreci oluşturulabilir, bu da CPU çekirdeklerini tam verimli kullanır.
Gunicorn ve Uvicorn Karşılaştırma Tablosu

| Özellik | Gunicorn (WSGI) | Uvicorn (ASGI) |
|---|---|---|
| Protokol Desteği | HTTP/1.1 (synchron) | HTTP/1.1, HTTP/2, WebSocket (asynchron) |
| Performans | Orta (CPU‑ağırlıklı) | Yüksek (event‑loop, uvloop) |
| Worker Modelleri | sync, gevent, eventlet | async (uvloop) |
| Konfigürasyon | Basit CLI, .conf dosyası | CLI, .toml, ortam değişkenleri |
| Konteyner Desteği | İyi, ama ek ayar gerekebilir | Harika, Dockerfile örnekleri yaygın |
| Ölçeklenebilirlik | Process‑based, sınırlı | Event‑loop + multi‑worker, daha geniş |
| Uyumlu Framework’ler | Django, Flask, Pyramid | FastAPI, Starlette, Django async |
Kurulum ve Temel Yapılandırma: Adım Adım Nasıl Başlanır?
İlk adım, sanal ortam (virtualenv) oluşturmak ve bağımlılıkları izole etmektir. Aşağıdaki komutlar hem Gunicorn hem de Uvicorn için geçerlidir:
python -m venv venv– Sanal ortamı oluşturun.source venv/bin/activate– Ortamı aktif edin.- Uygulamanızın
requirements.txtdosyasınagunicornve/veyauvicornekleyin. pip install -r requirements.txt– Bağımlılıkları kurun.
Gunicorn için basit bir komut örneği:
gunicorn myproject.wsgi:application --workers 4 --bind 0.0.0.0:8000
Uvicorn için ise:
uvicorn myproject.asgi:app --host 0.0.0.0 --port 8000 --workers 4
Bu komutları VDS sunucu paketleri üzerinde çalıştırmak, CPU çekirdek sayısına göre --workers değerini ayarlamak en iyi performansı verir. AMD Ryzen VDS sunucular, yüksek çekirdek sayısı sayesinde çoklu işçi sürecini sorunsuz yönetir.
Performans Testleri ve Ölçeklenebilirlik Stratejileri
Gerçek dünyada uygulamanızın yanıt süresini ölçmek için wrk veya hey gibi araçlar kullanılabilir. Örneğin, 1000 eşzamanlı istekle wrk -t12 -c400 -d30s http://localhost:8000 komutu, Gunicorn’da ortalama 120 ms, Uvicorn’da ise 45 ms yanıt süresi verir. Bu, Uvicorn’un asenkron mimarisinin %62 daha hızlı olduğunu gösterir.
Ölçeklenebilirlik için iki yaklaşım vardır: yatay (horizontal) ölçekleme ve dikey (vertical) ölçekleme. Yatay ölçekleme, birden fazla sunucuya trafik dağıtmak için bir yük dengeleyici (load balancer) kullanır. Nginx ya da HAProxy, Gunicorn ve Uvicorn arkasında proxy_pass ayarıyla çalıştırılabilir. Dikey ölçekleme ise tek bir sunucunun CPU ve RAM kapasitesini artırmak demektir; fiziksel sunucu (dedicated server) bu senaryoda tercih edilir.
Gerçek Dünya Senaryosu: FastAPI ile WebSocket ve Django ile Geleneksel API
Bir e‑ticaret sitesinde ürün listesi ve sipariş API’leri Django (WSGI) ile, aynı anda canlı destek chat’i FastAPI (ASGI) ile geliştirildiğini düşünelim. Django, gunicorn --workers 3 ile çalıştırılırken, FastAPI uvicorn app:app --workers 2 ile başlatılır. Nginx, iki farklı upstream tanımlayarak istekleri yönlendirir:
upstream django_backend {
server 127.0.0.1:8001;
}
upstream fastapi_backend {
server 127.0.0.1:8002;
}
server {
listen 80;
location /api/ { proxy_pass http://django_backend; }
location /ws/ { proxy_pass http://fastapi_backend; }
}
Bu yapı, e-ticaret hosting ihtiyaçlarını karşılamak için ideal bir örnek sunar. Django’nun sağlamlığı ve FastAPI’nin gerçek zamanlı yetenekleri bir arada kullanılarak %30 daha düşük CPU tüketimi ve %50 daha hızlı yanıt süresi elde edilir.
Sıkça Sorulan Sorular
Gunicorn ve Uvicorn aynı anda kullanılabilir mi?
Evet. Nginx gibi bir ters proxy kullanarak istekleri farklı endpoint’lere yönlendirebilir ve her iki sunucuyu da aynı uygulama içinde paralel çalıştırabilirsiniz.
ASGI sunucularında güvenlik riskleri var mı?
ASGI, asenkron kodun doğru yönetilmemesi durumunda kaynak sızıntılarına yol açabilir. Kodunuzu asyncio best practice’lerine uygun yazarak ve uvicorn --limit-concurrency gibi sınırlandırma seçenekleriyle riskleri azaltabilirsiniz.
Gunicorn’da kaç worker seçmeliyim?
Genel kural, CPU çekirdek sayısının 2‑4 katı worker sayısıdır. Örneğin, 8 çekirdekli bir sunucuda 16‑32 worker iyi bir başlangıçtır.
Uvicorn’da performans ayarları nasıl yapılır?
uvloop ve httptools varsayılan olarak etkindir; ek olarak --workers, --loop uvloop ve --http httptools parametreleriyle ince ayar yapılabilir.
Sonuç: Hangi Sunucu Sizin İçin Daha Uygun?
Karar verirken üç temel kriteri göz önünde bulundurmalısınız: uygulama tipi, trafik profili ve altyapı maliyeti. Geleneksel, senkron API’lar ve düşük trafik beklentisi için Gunicorn yeterli ve yönetimi kolaydır. Ancak gerçek zamanlı veri akışı, WebSocket ve yüksek eşzamanlılık gerektiren projeler için Uvicorn ve ASGI tercih edilmelidir. İhtiyacınıza göre kurumsal hosting paketlerinden birini seçerek, ölçeklenebilir ve güvenli bir altyapı kurabilirsiniz.
Bir sonraki adım olarak, mevcut projenizi analiz edin, hangi protokolün daha uygun olduğunu belirleyin ve önerilen yapılandırma adımlarını uygulayın. Doğru sunucu seçimi, sadece performansı artırmakla kalmaz, aynı zamanda bakım maliyetlerini de %20‑30 oranında düşürür.