format_list_bulletedBu İçerikte Bahsedilen Konular
- arrow_rightGunicorn Nedir ve Python Web Uygulamaları İçin Neden Önemlidir?
- arrow_rightGunicorn Kurulumu ve Temel Yapılandırma
- arrow_rightPip ile Gunicorn Kurulumu
- arrow_rightTemel Başlatma Komutları
- arrow_rightDjango Uygulamaları İçin Gunicorn Yapılandırması
- arrow_rightÖnerilen Worker Sayısı Hesaplama
- arrow_rightDjango İçin gunicorn.conf.py Yapılandırması
- arrow_rightDjango Projesi İçin systemd Servisi
- arrow_rightFlask Uygulamaları İçin Gunicorn Yapılandırması
- arrow_rightFlask için Temel Yapılandırma
- arrow_rightFlask Uygulamasını Başlatma
- arrow_rightGunicorn Worker Türleri ve Kullanım Alanları
- arrow_rightWorker Türü Seçim Kılavuzu
- arrow_rightPerformans Optimizasyonu ve En İyi Uygulamalar
- arrow_rightWorker Yönetimi
- arrow_rightTimeout Ayarları
- arrow_rightBellek Optimizasyonu
- arrow_rightNginx ile Gunicorn Entegrasyonu
- arrow_rightNginx Yapılandırması
- arrow_rightGunicorn Monitoring ve Hata Ayıklama
- arrow_rightLog Yönetimi
- arrow_rightSağlık Kontrolü
- arrow_rightOrtam Değişkenleri ile Yapılandırma
- arrow_rightDocker ve Gunicorn Kullanımı
- arrow_rightSonuç ve Öneriler
Gunicorn Nedir ve Python Web Uygulamaları İçin Neden Önemlidir?
Gunicorn (Green Unicorn), Python uygulamaları için tasarlanmış bir WSGI (Web Server Gateway Interface) sunucusudur. Özellikle Django ve Flask gibi popüler web framework'lerinde üretim ortamında yaygın olarak kullanılmaktadır. Gunicorn, uygulama sunucusu ile web sunucusu arasında köprü görevi görerek HTTP isteklerini Python uygulamanıza iletir.
2024 yılı itibarıyla, Python tabanlı web uygulamalarının %67'sinden fazlası üretim ortamında Gunicorn kullanmaktadır. Bu popülerlik, Gunicorn'un basit yapılandırma sintaksı, yüksek performans ve güvenilirliğinden kaynaklanmaktadır.
Gunicorn Kurulumu ve Temel Yapılandırma
Pip ile Gunicorn Kurulumu
Gunicorn'u kurmak için pip paket yöneticisini kullanmanız yeterlidir:
pip install gunicorn
Projenize özel olarak kurmak isterseniz:
pip install gunicorn==21.2.0
Temel Başlatma Komutları
Gunicorn'u temel düzeyde başlatmak için aşağıdaki komutları kullanabilirsiniz:
# Django için
gunicorn myproject.wsgi:application
# Flask için
gunicorn app:app
Bu komutlar, varsayılan ayarlarla Gunicorn'u 8000 portunda çalıştırır. Ancak üretim ortamında daha gelişmiş yapılandırmalar gerekmektedir.
Django Uygulamaları İçin Gunicorn Yapılandırması
Önerilen Worker Sayısı Hesaplama
Worker sayısını belirlerken şu formülü kullanabilirsiniz:
Önerilen Worker = (2 x CPU Çekirdeği) + 1
Örneğin, 4 çekirdekli bir sunucu için: (2 × 4) + 1 = 9 worker idealdir.
Django İçin gunicorn.conf.py Yapılandırması
# gunicorn.conf.py
import multiprocessing
import os
# Bağlama ayarları
bind = "0.0.0.0:8000"
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = "sync"
worker_connections = 1000
timeout = 30
keepalive = 2
# Logging ayarları
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
loglevel = "info"
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'
# Process adlandırma
proc_name = "my_django_app"
# Graceful shutdown
graceful_timeout = 30
max_requests = 1000
max_requests_jitter = 50
# Güvenlik ayarları
limit_request_line = 4094
limit_request_fields = 100
limit_request_field_size = 8190
Django Projesi İçin systemd Servisi
Gunicorn'u sistem servisi olarak çalıştırmak için systemd yapılandırması oluşturun:
[Unit]
Description=Gunicorn instance to serve Django application
After=network.target
[Service]
Type=notify
User=www-data
Group=www-data
WorkingDirectory=/var/www/myproject
Environment="PATH=/var/www/myproject/venv/bin"
ExecStart=/var/www/myproject/venv/bin/gunicorn \
--config gunicorn.conf.py \
myproject.wsgi:application
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Bu yapılandırmayı etkinleştirmek için: sudo systemctl enable gunicorn ve sudo systemctl start gunicorn komutlarını çalıştırın.
Flask Uygulamaları İçin Gunicorn Yapılandırması
Flask için Temel Yapılandırma
Flask uygulamalarında Gunicorn yapılandırması Django'ya benzer, ancak bazı farklılıklar vardır:
# gunicorn_flask.conf.py
bind = "0.0.0.0:8000"
workers = 4
worker_class = "gevent" # Async için gevent veya eventlet
worker_connections = 1000
timeout = 60
keepalive = 5
# Flask uygulama dosyanızın adı
wsgi_app = "app:app"
proc_name = "my_flask_app"
# Logging
accesslog = "-"
errorlog = "-"
loglevel = "debug"
Flask Uygulamasını Başlatma
gunicorn -c gunicorn_flask.conf.py app:app
Flask uygulamalarında eşzamanlı istekler için worker_class = "sync", gerçek zamanlı uygulamalar için ise worker_class = "gevent" kullanmanızı öneriyoruz.
Gunicorn Worker Türleri ve Kullanım Alanları
Gunicorn farklı worker türlerini destekler. Doğru worker seçimi uygulamanızın performansını doğrudan etkiler:
| Worker Türü | Kullanım Alanı | Avantajlar |
|---|---|---|
| sync | Standart WSGI uygulamaları | Basit, güvenilir, düşük bellek kullanımı |
| gevent | Gerçek zamanlı uygulamalar, WebSocket | Yüksek eşzamanlılık, düşük gecikme |
| eventlet | IO yoğun uygulamalar | Yüksek performans, greenlet desteği |
| tornado | Long polling, streaming | Asenkron HTTP desteği |
| gthread | Thread havuzu gerektiren uygulamalar | Thread tabanlı paralellik |
Worker Türü Seçim Kılavuzu
- Basit CRUD uygulamaları: sync worker yeterlidir
- WebSocket veya streaming: gevent veya eventlet kullanın
- Yüksek trafikli API'ler: gthread veya gevent tercih edin
- Mikroservis mimarileri: sync veya gthread uygundur
Performans Optimizasyonu ve En İyi Uygulamalar
Worker Yönetimi
Gunicorn worker sayısını yapılandırırken sunucu kaynaklarınızı dikkate almalısınız. Aşırı worker sayısı bellek tüketimini artırırken, az sayıda worker ise performansı düşürebilir.
# Önerilen yapılandırma
workers = (2 * cpu_cores) + 1
threads = 2 # Her worker için thread sayısı (gthread kullanılıyorsa)
Timeout Ayarları
Timeout değerlerini uygulamanızın ihtiyaçlarına göre ayarlayın:
- Kısa işlemler (API): timeout = 30
- Orta dereceli işlemler: timeout = 60
- Uzun süren işler: timeout = 120+
Bellek Optimizasyonu
Worker başına bellek sızıntılarını önlemek için max_requests parametresini kullanın:
max_requests = 1000
max_requests_jitter = 50 # Tüm worker'ların aynı anda yeniden başlamasını önler
Bu ayar, her 1000 istekten sonra worker'ın yeniden başlatılmasını sağlayarak bellek sızıntılarının önüne geçer.
Nginx ile Gunicorn Entegrasyonu
Gunicorn doğrudan internet-facing bir sunucu olarak kullanılmamalıdır. Önünde bir web sunucusu (Nginx) bulunmalıdır. Bu mimari hem güvenlik hem de performans açısından önerilmektedir.
Nginx Yapılandırması
upstream django_app {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://django_app;
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 /var/www/myproject/static/;
}
location /media/ {
alias /var/www/myproject/media/;
}
}
Nginx, statik dosyaları doğrudan servis ederken, dinamik istekleri Gunicorn'a iletir. Bu yapı, sunucu kaynaklarının daha verimli kullanılmasını sağlar.
Gunicorn Monitoring ve Hata Ayıklama
Log Yönetimi
Üretim ortamında log'ları düzgün yapılandırmak kritik öneme sahiptir:
# JSON formatında loglama için
accesslog = "/var/log/gunicorn/access.log"
errorlog = "/var/log/gunicorn/error.log"
loglevel = "warning"
# Log rotasyonu
logconfig_dict = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
}
},
"handlers": {
"file": {
"class": "logging.handlers.RotatingFileHandler",
"filename": "/var/log/gunicorn/app.log",
"maxBytes": 10485760, # 10MB
"backupCount": 5
}
},
"root": {
"level": "INFO",
"handlers": ["file"]
}
}
Sağlık Kontrolü
Uygulamanızın sağlık durumunu kontrol etmek için bir endpoint oluşturun:
# health_check.py
def health_check(environ):
return 200, [('Content-Type', 'text/plain')], b"OK"
# gunicorn.conf.py içinde
def on_starting(server):
server.app_uri = "http://health"
def worker_int(worker):
# Graceful shutdown için
pass
Ortam Değişkenleri ile Yapılandırma
Farklı ortamlar için yapılandırma yönetimi önemlidir:
# gunicorn_config.py
import os
env = os.getenv("ENV", "production")
if env == "development":
workers = 2
loglevel = "debug"
reload = True
elif env == "staging":
workers = 4
loglevel = "info"
else:
workers = multiprocessing.cpu_count() * 2 + 1
loglevel = "warning"
timeout = 30
Ortam değişkenlerini kullanarak tek bir yapılandırma dosyası ile farklı ortamlar için Gunicorn'u çalıştırabilirsiniz.
Docker ve Gunicorn Kullanımı
Container tabanlı deployment için Dockerfile örneği:
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# Gunicorn ile uygulamayı başlat
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "--worker-class", "uvicorn.workers.UvicornWorker", "main:app"]
Docker Compose ile çalıştırmak için:
# docker-compose.yml
services:
web:
build: .
ports:
- "8000:8000"
environment:
- ENV=production
volumes:
- ./logs:/var/log/gunicorn
Güvenlik Yapılandırması
Gunicorn güvenlik ayarlarını yapılandırmak kritik önem taşır:
# Güvenlik ayarları
limit_request_line = 4094
limit_request_fields = 100
limit_request_field_size = 8190
# User/group ayarları (çalıştırma yetkileri)
user = "www-data"
group = "www-data"
# SSL/TLS için
keyfile = "/etc/ssl/private/server.key"
certfile = "/etc/ssl/certs/server.crt"
Sonuç ve Öneriler
Gunicorn, Python web uygulamaları için güçlü ve esnek bir WSGI sunucusudur. Doğru yapılandırma ile yüksek performans elde edebilirsiniz. İşte en önemli önerilerimiz:
- Worker sayısını CPU çekirdeklerine göre hesaplayın
- Timeout değerlerini uygulama ihtiyaçlarına göre ayarlayın
- Log'ları düzenli olarak izleyin ve rotasyon yapın
- Nginx ile birlikte kullanın
- max_requests ile bellek sızıntılarını önleyin
- Worker türünü uygulama tipine göre seçin
Sunucu altyapınız için doğru çözümü seçmek isterseniz, kurumsal hosting hizmetlerimizi inceleyebilirsiniz. Ayrıca .htaccess yönlendirme rehberi