Gunicorn, bir Python WSGI HTTP server uygulamasıdır. Nginx gibi bir reverse-proxy ve HTTP server uygulaması ile işbirliği içinde çalışarak dinamik Python uygulamanızın kullanıcıya servis edilmesini sağlar.
Daphne ise, Gunicorn benzeri bir uygulama olsa da ASGI arayüzüyle uyumlu bir HTTP server uygulaması olarak fark gösterir. Ayrıca Gunicorn'a ek olarak HTTP2 ve WebSocket protokollerini de destekler.
Hangisi, ne zaman kullanılır?
Django ile yazdığınız bir sohbet uygulamanız olduğunu düşünün. Gerçek zamanlı ve yoklama (polling) yapmayan bir sohbet için WebSocket'leri kullanmalısınız. Gunicorn bu noktada yetersiz kalır. Django uygulamanızı Gunicorn ile servis edebilirsiniz ancak en azından WebSocket'leri Daphne ile servis etmeniz gerekir ve bunu da Nginx gibi bir reverse-proxy ile istek adresine göre ilgili uygulamaya yönlendirmelisiniz. Örneğin, /ws/
yoluna gelen tüm istekleri Daphne'ye yönlendirirken, diğer tüm istekleri Gunicorn'a iletebilirsiniz.
Daphne vs Gunicorn
Bu kıyaslama ilk bakışta elma ile armut kıyası gibi olsa da önemli. Çünkü Daphne aynı zamanda Gunicorn'un yaptığını da yaparak geleneksel HTTP/1 isteklerini karşılayabiliyor. Bu da, Gunicorn'u aradan çıkarıp sadece Daphne ile devam edebilmenize imkan tanıyor. Ancak, herkes Gunicorn kullanırken Daphne kullanmak doğru mu sorusu aklınıza gelebilir.
Daphne
+ Geniş destek: HTTP/1, HTTP/2, WebSocket
+ WebSocket isteklerini (/ws/
) reverse-proxy'lemeye gerek yok
- Kanıtlanmamış stabilite?
- Yetersiz topluluk desteği?
Gunicorn
+ Kanıtlanmış stabilite
+ Büyük topluluk desteği
- HTTP/2 ve WebSocket isteklerini desteklemez
- Desteklenmeyen türdeki istekler için reverse-proxy ve HTTP server gerektirir
Her ikisini de kullanmak
Bu da bir çözüm. Nginx ile gelen yanıtı ilgili uygulamaya yönlendirebiliriz. Örnek bir Nginx dosyası:
upstream server_http {
server backend:8000;
}
upstream server_ws {
server daphne:9001;
}
server {
listen 80;
# ...
location / {
proxy_pass http://server_http;
# ...
}
location /ws/ {
proxy_pass http://server_ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# ...
}
# ...
}
Bu Nginx konfigürasyonuna göre, /ws/
yoluna gelen istekler 9001
portundaki daphne
isimli servise iletilecekken, diğer tüm istekler 8000
portundaki backend
servisine iletilecek.