Giriş
Nginx ve uWSGI kombinasyonu Python web uygulamaları için endüstri standardıdır. Nginx TLS sonlandırma, static dosya sunumu, gzip sıkıştırma ve rate limiting üstlenir; uWSGI yalnızca dinamik WSGI isteklerini işler.
Bu ayrım performans ve güvenlik sağlar: Nginx yüksek eşzamanlı bağlantıları verimli yönetir, uWSGI Python interpreter'ı izole eder.
Bu rehberde unix socket bağlantısı, uwsgi_params, location blokları ve yaygın hata senaryolarını inceliyoruz.
Unix Socket Bağlantısı
uWSGI socket = /run/uwsgi/app.sock ile unix domain socket oluşturur. Nginx uwsgi_pass unix:/run/uwsgi/app.sock; ile bağlanır. TCP'ye göre %10-30 daha düşük gecikme ve dosya sistemi izinleriyle güvenlik sağlar.
chmod-socket = 660 ve chown-socket = www-data:www-data nginx kullanıcısının socket'e yazmasını sağlar. Socket dizini /run/uwsgi systemd-tmpfiles ile oluşturulmalıdır.
[uwsgi]
socket = /run/uwsgi/myapp.sock
chmod-socket = 660
chown-socket = www-data:www-data
vacuum = trueNginx Location Yapılandırması
location / bloğu tüm dinamik istekleri uWSGI'ye yönlendirir. include uwsgi_params; standart CGI parametrelerini set eder. uwsgi_param SCRIPT_NAME /; alt dizin deploy'larında önemlidir.
location /static/ alias /var/www/static/; ile static dosyalar doğrudan Nginx'ten sunulur; uWSGI'ye gitmez.
- include uwsgi_params zorunlu
- static dosyaları Nginx'ten sunun
- upstream ile failover tanımlayın
- client_max_body_size upload limiti
upstream uwsgi_backend {
server unix:/run/uwsgi/myapp.sock;
}
server {
listen 80;
server_name example.com;
location /static/ { alias /var/www/static/; }
location / {
include uwsgi_params;
uwsgi_pass uwsgi_backend;
}
}SSL Termination
Nginx'te listen 443 ssl; ve sertifika yolları tanımlanır. uWSGI yalnızca HTTP alır; HTTPS Nginx'te sonlanır. proxy_set_header veya uwsgi_param ile X-Forwarded-Proto https iletilir.
Let's Encrypt certbot --nginx ile otomatik sertifika ve yenileme kurulur. Django SECURE_PROXY_SSL_HEADER ayarı bu header'ı tanır.
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
include uwsgi_params;
uwsgi_param HTTPS on;
uwsgi_pass unix:/run/uwsgi/myapp.sock;
}
}Performans Ayarları
Nginx worker_processes auto; ve worker_connections 1024; yüksek eşzamanlılık sağlar. uwsgi_buffers ve uwsgi_buffer_size büyük yanıtlar için ayarlanır.
gzip on; ve gzip_types text/css application/javascript; bant genişliği tasarrufu sağlar. uWSGI tarafında post-buffering büyük POST isteklerini tamponlar.
- Static dosyaları uWSGI'den ayırın
- gzip sıkıştırmayı etkinleştirin
- unix socket kullanın
- worker sayısını CPU'ya göre ayarlayın
Hata Ayıklama
502 Bad Gateway genelde socket izin hatası veya uWSGI çalışmıyor demektir. ls -la /run/uwsgi/ ile socket varlığını kontrol edin. uwsgi.log'da import hataları arayın.
504 Gateway Timeout uWSGI harakiri veya Nginx proxy_read_timeout aşımıdır. Her iki tarafta timeout değerlerini uyumlu ayarlayın.
# Nginx timeout ayarları
uwsgi_read_timeout 60;
uwsgi_send_timeout 60;
proxy_read_timeout 60;Static dosyaları asla uWSGI'ye yönlendirmeyin; bu en yaygın performans hatasıdır.
Docker Ortamında
Docker Compose'da nginx ve uwsgi ayrı servislerdir; paylaşılan volume ile socket mount edilir. /run/uwsgi volume her iki konteynerde aynı path'te olmalıdır.
Alternatif olarak internal TCP (uwsgi_pass 172.x.x.x:8000) kullanılabilir; unix socket kadar hızlı değildir ama volume paylaşımı gerektirmez.
services:
uwsgi:
volumes: ["socket:/run/uwsgi"]
nginx:
volumes: ["socket:/run/uwsgi"]
volumes:
socket:Sonuç
Nginx + uWSGI entegrasyonu doğru yapılandırıldığında yüksek performanslı ve güvenli bir üretim yığını oluşturur. Static/dinamik ayrımı, unix socket ve SSL termination temel üçlüdür.
Konfigürasyonları infrastructure-as-code ile yönetin; her değişikliği staging'de nginx -t ve uwsgi --ini ile doğrulayın.