Python WSGI Uygulamalarını Gunicorn ve Nginx ile Dağıtma: Kapsamlı Bir Rehber
Giriş
Modern web uygulamalarının geliştirilmesi, Python gibi dinamik dillerle hızla ilerlese de, bu uygulamaların üretim ortamında güvenilir, performanslı ve ölçeklenebilir bir şekilde çalıştırılması ayrı bir uzmanlık gerektirir. Python tabanlı web uygulamaları genellikle Flask, Django gibi framework’ler kullanılarak geliştirilir ve bu uygulamaların web sunucuları ile etkileşime girmesi için bir standart olan WSGI (Web Server Gateway Interface) kullanılır. Doğrudan bir web sunucusu olarak tasarlanmamış olan Python uygulamaları, genellikle bir WSGI sunucusu (örneğin Gunicorn) aracılığıyla gelen istekleri işler. Ancak, bu WSGI sunucularını doğrudan internete açmak, güvenlik ve performans açısından ideal değildir. İşte bu noktada Nginx gibi yüksek performanslı bir ters proxy sunucusunun devreye girmesi kritik hale gelir.
Bu makale, Python WSGI uygulamalarınızı Gunicorn HTTP sunucusu kullanarak dağıtmayı ve Nginx’i bu uygulamanın önüne bir ters proxy olarak konumlandırmayı adım adım ele alacaktır. Amacımız, geliştiricilere ve sistem yöneticilerine, Python web uygulamalarını üretim ortamında güvenli, verimli ve ölçeklenebilir bir şekilde nasıl dağıtacaklarına dair kapsamlı bir rehber sunmaktır. WSGI’nin temel prensiplerinden başlayarak, Gunicorn ve Nginx’in rollerini, dağıtım mimarisini, adım adım kurulum ve yapılandırma süreçlerini, performans ipuçlarını ve sık karşılaşılan sorunları detaylı bir şekilde inceleyeceğiz.
WSGI Nedir ve Neden Önemlidir?
WSGI (Web Server Gateway Interface), Python web sunucuları ile Python web uygulamaları veya framework’leri arasında standart bir arayüz tanımlayan bir spesifikasyondur. Temel olarak, WSGI, web sunucusunun (örneğin, Nginx aracılığıyla gelen istekleri işleyen Gunicorn gibi bir WSGI sunucusu) bir Python uygulamasını nasıl çağıracağını ve uygulamanın sunucuya nasıl yanıt vereceğini belirler.
WSGI’nin ortaya çıkışından önce, Python web uygulamalarını farklı web sunucularıyla entegre etmek karmaşık ve framework’e özel çözümler gerektiriyordu. Her web sunucusu (Apache, IIS, vb.) ve her Python web framework’ü (Django, Flask, vb.) kendi entegrasyon yöntemine sahipti. Bu durum, geliştiriciler için esnekliği azaltıyor ve farklı dağıtım ortamları arasında geçişi zorlaştırıyordu.
WSGI, bu sorunu çözerek bir köprü görevi görür. Bir WSGI sunucusu (Gunicorn, uWSGI vb.) WSGI standardına uygun bir şekilde HTTP isteklerini alır, bu istekleri bir Python sözlüğüne dönüştürür ve WSGI standardına uygun bir Python uygulamasına iletir. Uygulama, bu sözlüğü kullanarak bir yanıt oluşturur ve bu yanıtı yine WSGI standardına uygun olarak WSGI sunucusuna geri gönderir. WSGI sunucusu da bu yanıtı HTTP protokolüne uygun hale getirerek istemciye geri gönderir.
WSGI’nin temel faydaları şunlardır:
* Standardizasyon: Farklı web sunucuları ve Python framework’leri arasında tutarlı bir iletişim sağlar.
* Esneklik: Geliştiriciler, uygulamalarını farklı WSGI sunucuları ve web sunucuları ile kolayca dağıtabilir.
* Modülerlik: Uygulama katmanı ile sunucu katmanını birbirinden ayırarak, her bir bileşenin bağımsız olarak geliştirilmesine ve güncellenmesine olanak tanır.
* Performans: WSGI sunucuları, Python uygulamalarının performansını optimize etmek için özel olarak tasarlanmıştır.
Kısacası, WSGI, Python web ekosisteminin temel bir yapı taşıdır ve uygulamalarımızın üretim ortamında sorunsuz bir şekilde çalışmasını sağlayan kritik bir arabirimdir.
Gunicorn’a Yakından Bakış
Gunicorn (Green Unicorn), Python WSGI uygulamaları için tasarlanmış sağlam, hızlı ve hafif bir HTTP sunucusudur. Genellikle “önce çatallama” (pre-fork) modeli kullanan bir Unix WSGI HTTP sunucusu olarak tanımlanır. Bu, Gunicorn’ın ana sürecinin (master process) belirli sayıda işçi süreci (worker processes) başlatması anlamına gelir. Gelen her istek, bu işçi süreçlerinden biri tarafından işlenir.
Gunicorn’ın temel özellikleri ve avantajları şunlardır:
* Basitlik: Kurulumu ve yapılandırması oldukça kolaydır. Minimal bağımlılıklara sahiptir.
* Hız: C dilinde yazılmış bazı bileşenleri sayesinde yüksek performans sunar.
* Kararlılık: Uzun süreli üretim ortamı kullanımı için tasarlanmıştır ve oldukça kararlıdır.
* WSGI Uyumluluğu: Flask, Django gibi tüm popüler Python web framework’leri ile sorunsuz çalışır.
* Kaynak Yönetimi: Her worker süreci bağımsız olarak çalıştığı için, bir worker’da meydana gelen bir hata diğerlerini etkilemez ve master süreci hatalı worker’ı otomatik olarak yeniden başlatabilir.
* Ölçeklenebilirlik: Worker sayısı kolayca ayarlanabilir, bu da uygulamanın gelen yüke göre ölçeklenmesini sağlar.
Gunicorn’ın çalışma modeli:
1. Master Süreci: Gunicorn başlatıldığında bir master süreci oluşur. Bu süreç, worker süreçlerini yönetmekten, onların sağlığını izlemekten ve gerektiğinde yeniden başlatmaktan sorumludur.
2. Worker Süreçleri: Master süreci, yapılandırma dosyasında belirtilen sayıda worker süreci başlatır. Her worker süreci, Python uygulamasının bir kopyasını yükler ve gelen HTTP isteklerini işlemek için hazır bekler.
3. İstek İşleme: Gelen bir HTTP isteği, master süreci tarafından uygun bir worker sürecine yönlendirilir. Worker, isteği işler, Python uygulamasından bir yanıt alır ve bu yanıtı istemciye geri gönderir.
Gunicorn, doğrudan internete açılmak yerine genellikle Nginx gibi bir ters proxy’nin arkasında çalışacak şekilde tasarlanmıştır. Bunun nedeni, Gunicorn’ın statik dosya sunumu, SSL sonlandırma, yük dengeleme gibi gelişmiş web sunucusu özelliklerini sağlamamasıdır. Bu görevler için Nginx çok daha yetenekli ve optimize edilmiştir.
Nginx’in Rolü
Nginx (engine-x), yüksek performanslı, açık kaynaklı bir web sunucusu, ters proxy, yük dengeleyici ve HTTP önbellekleyicisidir. Özellikle eşzamanlı bağlantıları ve yüksek trafiği verimli bir şekilde yönetme yeteneğiyle bilinir. Gunicorn’ın arkasında Nginx kullanmak, Python uygulamalarınızın üretim ortamında çok daha sağlam ve performanslı olmasını sağlar.
Nginx’in Gunicorn’ın önüne konulmasının temel nedenleri şunlardır:
* Statik Dosya Sunumu: Python web uygulamaları genellikle HTML, CSS, JavaScript dosyaları ve resimler gibi statik içerikler içerir. Gunicorn bu tür dosyaları sunmak için optimize edilmemiştir ve bunu yapmak performans kaybına yol açar. Nginx, statik dosyaları doğrudan ve son derece verimli bir şekilde sunabilir, bu da Gunicorn’ın yalnızca dinamik istekleri işlemesine olanak tanır.
* SSL/TLS Sonlandırma: Güvenli iletişim için HTTPS gereklidir. Nginx, SSL/TLS sertifikalarını yönetebilir ve şifreleme/şifre çözme işlemlerini üstlenebilir. Bu, Gunicorn’ın bu ek yükü taşımak zorunda kalmamasını sağlar ve performansı artırır.
* Yük Dengeleme: Birden fazla Gunicorn örneği veya uygulama sunucusu çalıştırıyorsanız, Nginx gelen istekleri bu sunucular arasında dağıtarak yük dengelemesi yapabilir. Bu, uygulamanızın ölçeklenebilirliğini ve hata toleransını artırır.
* Önbellekleme: Nginx, sık erişilen içerikleri önbelleğe alarak sunucuya olan yükü azaltabilir ve yanıt sürelerini iyileştirebilir.
* Güvenlik: Nginx, çeşitli güvenlik özellikleri sunar. Örneğin, kötü niyetli istekleri filtreleyebilir, DoS/DDoS saldırılarına karşı bir tampon görevi görebilir ve istek hızını sınırlayabilir.
* Gzip Sıkıştırma: Nginx, istemciye gönderilen metin tabanlı yanıtları (HTML, CSS, JS) sıkıştırarak bant genişliği kullanımını azaltabilir ve yükleme sürelerini hızlandırabilir.
* Daha İyi Ağ Yönetimi: Nginx, ağ katmanındaki bağlantıları daha verimli yönetir ve binlerce eşzamanlı bağlantıyı düşük kaynak tüketimiyle idare edebilir.
Özetle, Nginx, bir ters proxy olarak Gunicorn’a gelen tüm dış istekleri karşılar. Statik dosyaları doğrudan sunar, SSL’i sonlandırır ve diğer tüm dinamik istekleri Gunicorn’a yönlendirir. Bu mimari, hem performans hem de güvenlik açısından en iyi uygulamayı temsil eder.
Dağıtım Mimarisi
Python WSGI uygulamanızı Gunicorn ve Nginx ile dağıtırken, tipik mimari aşağıdaki gibidir:
1. Kullanıcı/İstemci: Tarayıcı veya başka bir uygulama aracılığıyla web uygulamanıza HTTP/HTTPS isteği gönderir.
2. Nginx (Ters Proxy):
* İstemciden gelen tüm istekleri ilk olarak Nginx karşılar.
* SSL/TLS sonlandırması burada gerçekleşir (HTTPS kullanılıyorsa).
* Gelen isteğin bir statik dosya (CSS, JS, resimler vb.) olup olmadığını kontrol eder. Eğer statik bir dosya ise, Nginx bu dosyayı doğrudan kendi dosya sisteminden istemciye sunar.
* Eğer istek dinamik bir uygulama isteğiyse, Nginx bu isteği bir dahili ağ soketi (Unix soketi veya TCP soketi) üzerinden Gunicorn’a iletir.
3. Gunicorn (WSGI Sunucusu):
* Nginx’ten gelen dinamik istekleri alır.
* Bu istekleri WSGI standardına uygun bir şekilde Python uygulamanıza iletir.
* Python uygulamasından gelen yanıtı alır.
* Yanıtı Nginx’e geri gönderir.
4. Python WSGI Uygulaması (Flask/Django):
* Gunicorn’dan gelen istekleri işler.
* Gerekirse veritabanı veya diğer servislerle etkileşime girer.
* İsteğe uygun dinamik içeriği (HTML, JSON vb.) oluşturur.
* Oluşturulan yanıtı Gunicorn’a geri gönderir.
Bu mimari, her bileşenin kendi özel görevine odaklanmasını sağlar ve böylece sistemin genel verimliliğini, güvenliğini ve ölçeklenebilirliğini artırır. Nginx, internete bakan ön cephe görevi görürken, Gunicorn ve Python uygulaması arka planda güvenli bir şekilde çalışır.
Ön Koşullar ve Kurulum
Bu rehberde Ubuntu/Debian tabanlı bir sunucu ortamını temel alacağız. Adımlara başlamadan önce aşağıdaki ön koşulların yerine getirildiğinden emin olun:
* Bir Linux Sunucusu: Tercihen Ubuntu 20.04 veya üzeri. SSH erişimine sahip olmalısınız.
* Root Olmayan Bir Kullanıcı: Güvenlik nedeniyle sudo yetkilerine sahip root olmayan bir kullanıcı ile çalışmanız önerilir.
* Python 3 ve pip: Modern Python uygulamaları genellikle Python 3 kullanır.
* Virtual Environment (Sanal Ortam): Proje bağımlılıklarını izole etmek için şiddetle tavsiye edilir.
Kurulum Adımları:
1. Sistem Güncellemesi:
sudo apt update
sudo apt upgrade -y
2. Python 3 ve Gerekli Araçların Kurulumu:
sudo apt install python3 python3-pip python3-venv build-essential libssl-dev libffi-dev python3-dev -y
Bu komut, Python 3, pip, sanal ortam modülü ve bazı derleme araçlarını kurar.
3. Proje Dizini Oluşturma ve Sanal Ortam Kurulumu:
Genellikle /var/www/ altında proje dizinleri oluşturulur.
sudo mkdir -p /var/www/myproject
sudo chown -R $USER:$USER /var/www/myproject # Kullanıcınıza izin verin
cd /var/www/myproject
python3 -m venv venv
source venv/bin/activate
Artık sanal ortamınız aktif ve terminalinizde (venv) ön eki görünmeli.
4. Örnek Bir Flask Uygulaması Oluşturma:
Uygulamanızın kök dizininde app.py adında bir dosya oluşturun:
# /var/www/myproject/app.py
from flask import Flask, render_template_string
app = Flask(__name__)
@app.route('/')
def home():
return render_template_string("Bu bir Python Flask uygulamasıdır.
")
@app.route('/hello/')
def hello(name):
return f"Gunicorn ve Nginx ile dağıtıldı.
"
if __name__ == '__main__':
app.run(debug=True)
Ayrıca requirements.txt dosyasını oluşturun:
# /var/www/myproject/requirements.txt
Flask
gunicorn
Bağımlılıkları yükleyin:
pip install -r requirements.txt
5. Nginx Kurulumu:
sudo apt install nginx -y
sudo ufw allow 'Nginx HTTP' # Firewall'dan Nginx'e izin ver
sudo systemctl start nginx
sudo systemctl enable nginx
Tarayıcınızda sunucunuzun IP adresine giderek Nginx’in varsayılan hoş geldiniz sayfasını görmelisiniz.
Adım Adım Dağıtım Süreci
1. Python Uygulamasını Hazırlama
Yukarıdaki “Ön Koşullar ve Kurulum” bölümünde zaten basit bir Flask uygulaması (app.py) ve requirements.txt dosyası oluşturduk. Sanal ortamı etkinleştirdiğinizden ve bağımlılıkları yüklediğinizden emin olun:
cd /var/www/myproject
source venv/bin/activate
pip install -r requirements.txt
Bu adımlar, uygulamanızın Gunicorn tarafından çalıştırılmaya hazır olmasını sağlar.
2. Gunicorn’ı Test Etme
Sanal ortamınız aktifken, uygulamanızı Gunicorn ile manuel olarak çalıştırarak test edebilirsiniz:
gunicorn --workers 3 --bind 0.0.0.0:8000 app:app
--workers 3: Gunicorn’ın 3 worker süreci başlatmasını söyler. Genellikle (2 CPU çekirdeği sayısı) + 1 formülü önerilir.
* --bind 0.0.0.0:8000: Gunicorn’ın tüm ağ arayüzlerinde 8000 numaralı porttan gelen bağlantıları dinlemesini sağlar.
* app:app: İlk app modül adıdır (app.py dosyanız). İkinci app ise modül içindeki Flask uygulama nesnesinin adıdır (app = Flask(__name__)).
Tarayıcınızda http://SUNUCU_IP_ADRESİ:8000 adresine giderek uygulamanızın çalıştığını görmelisiniz. Bu test, Gunicorn’ın uygulamanızı başarıyla başlatabildiğini doğrular. Ctrl+C ile Gunicorn’ı durdurabilirsiniz.
3. Gunicorn’ı Bir Systemd Servisi Olarak Yapılandırma
Uygulamanızın sunucu yeniden başlatıldığında otomatik olarak başlaması, çöktüğünde yeniden başlatılması ve loglarının yönetilmesi için Gunicorn’ı bir systemd servisi olarak yapılandırmak en iyi yaklaşımdır.
Bir systemd servis dosyası oluşturalım:
sudo nano /etc/systemd/system/myproject.service
Dosyanın içine aşağıdaki içeriği yapıştırın (kendi kullanıcı adınızı, grup adınızı ve proje yolunuzu güncellediğinizden emin olun):
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=your_username # SSH ile bağlandığınız kullanıcı adınız
Group=www-data
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/gunicorn --workers 3 --bind unix:/var/www/myproject/myproject.sock -m 007 app:app
Restart=always
[Install]
WantedBy=multi-user.target
Açıklamalar:
* User ve Group: Gunicorn’ın hangi kullanıcı ve grup izinleriyle çalışacağını belirtir. www-data genellikle web sunucusu süreçleri için kullanılan gruptur.
* WorkingDirectory: Projenizin kök dizini.
* ExecStart: Gunicorn’ı başlatan komut. Burada --bind parametresi olarak bir Unix soketi (unix:/var/www/myproject/myproject.sock) kullanıyoruz. Nginx ile iletişim kurarken TCP portu yerine Unix soketi kullanmak genellikle daha performanslı ve güvenlidir, çünkü aynı makine üzerindeki iki süreç arasında doğrudan dosya sistemi üzerinden iletişim kurar. -m 007 soket izinlerini ayarlar.
* Restart=always: Gunicorn süreci çökerse veya beklenmedik bir şekilde durursa, systemd onu otomatik olarak yeniden başlatır.
Dosyayı kaydedin ve kapatın (Ctrl+O, Enter, Ctrl+X).
Şimdi systemd servisini etkinleştirin ve başlatın:
sudo systemctl daemon-reload
sudo systemctl start myproject
sudo systemctl enable myproject
Servisin durumunu kontrol edin:
sudo systemctl status myproject
Çıktıda active (running) ve herhangi bir hata görmemelisiniz. Ayrıca, projenizin kök dizininde myproject.sock dosyasının oluştuğunu kontrol edebilirsiniz:
ls -l /var/www/myproject/myproject.sock
4. Nginx’i Yapılandırma
Nginx’i, gelen web isteklerini Gunicorn’a yönlendirecek şekilde yapılandırmamız gerekiyor.
Yeni bir Nginx sunucu bloğu dosyası oluşturalım:
sudo nano /etc/nginx/sites-available/myproject
Dosyanın içine aşağıdaki içeriği yapıştırın (kendi alan adınızı veya IP adresinizi güncelleyin):
server {
listen 80;
server_name your_domain.com www.your_domain.com your_server_ip; # Alan adınızı veya IP adresinizi buraya yazın
root /var/www/myproject; # Statik dosyalarınızın kök dizini
location /static/ {
alias /var/www/myproject/static/; # Statik dosyalarınızın gerçek yolu
}
location / {
include proxy_params;
proxy_pass http://unix:/var/www/myproject/myproject.sock;
}
}
Açıklamalar:
* listen 80;: Nginx’in HTTP istekleri için 80 numaralı portu dinlemesini sağlar.
* server_name: Alan adınızı veya sunucunuzun IP adresini buraya ekleyin.
* root /var/www/myproject;: Nginx’in varsayılan olarak hangi dizinde dosya arayacağını belirtir. Bu, özellikle location /static/ bloğu tanımlanmadığında veya hata sayfaları gibi durumlarda kullanılabilir.
* location /static/: Uygulamanızın statik dosyalarını (CSS, JS, resimler) doğrudan Nginx üzerinden sunmak için kullanılır. alias yönergesi, /static/ ile başlayan tüm isteklerin /var/www/myproject/static/ dizininden alınmasını sağlar. Bu dizini projenizde oluşturmayı unutmayın!
mkdir -p /var/www/myproject/static
Test için içine basit bir test.html koyabilirsiniz.
* location /: /static/ ile eşleşmeyen diğer tüm isteklerin Gunicorn’a yönlendirilmesini sağlar.
* include proxy_params;: Nginx’in proxy modülü için standart başlıkları içerir (örneğin, Host, X-Real-IP). Bu dosya /etc/nginx/proxy_params yolunda bulunur.
* proxy_pass http://unix:/var/www/myproject/myproject.sock;: İstekleri Gunicorn’ın dinlediği Unix soketine iletir.
Dosyayı kaydedin ve kapatın.
Şimdi bu yapılandırmayı etkinleştirmek için bir sembolik bağlantı oluşturun:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Nginx’in varsayılan yapılandırma dosyasını devre dışı bırakmak iyi bir uygulamadır:
sudo rm /etc/nginx/sites-enabled/default
Nginx yapılandırmanızın sözdizimini test edin:
sudo nginx -t
Eğer test is successful mesajını görürseniz, Nginx’i yeniden başlatın:
sudo systemctl restart nginx
Artık tarayıcınızda sunucunuzun IP adresine veya alan adına giderek Flask uygulamanızın Nginx üzerinden çalıştığını görmelisiniz!
5. Güvenlik ve SSL/TLS (Opsiyonel ama Önemli)
Üretim ortamında uygulamanızın HTTPS üzerinden güvenli bir şekilde çalışması hayati öneme sahiptir. Let’s Encrypt ve Certbot, ücretsiz SSL/TLS sertifikaları sağlamak için harika bir çözümdür.
1. Certbot Kurulumu:
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
2. SSL Sertifikası Alma ve Nginx Entegrasyonu:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot, Nginx yapılandırmanızı otomatik olarak güncelleyerek HTTPS’i etkinleştirecek ve HTTP isteklerini HTTPS’e yönlendirecektir. İşlem sırasında e-posta adresi ve hizmet şartlarını kabul etmeniz istenecektir.
3. Firewall (UFW) Yapılandırması:
Daha önce sadece HTTP’ye izin vermiştik. Şimdi HTTPS’e de izin vermeliyiz:
sudo ufw allow 'Nginx HTTPS'
sudo ufw delete allow 'Nginx HTTP' # İsteğe bağlı, HTTP'yi tamamen kapatmak isterseniz
sudo ufw reload
sudo ufw status komutuyla firewall durumunu kontrol edebilirsiniz.
Bu adımlardan sonra uygulamanız artık https://your_domain.com üzerinden güvenli bir şekilde erişilebilir olacaktır.
Performans ve Ölçeklenebilirlik İpuçları
Uygulamanızın üretim ortamında en iyi performansı göstermesi için bazı ek optimizasyonlar yapabilirsiniz:
Gunicorn Worker Sayısı: (2 CPU çekirdeği sayısı) + 1 genel bir kural olsa da, uygulamanızın bellek tüketimine ve CPU kullanımına göre bu sayıyı ayarlamanız gerekebilir. Daha fazla worker, daha fazla bellek tüketimi anlamına gelir. Yüksek I/O yoğunluklu uygulamalarda daha fazla worker faydalı olabilirken, CPU yoğun uygulamalarda CPU çekirdeği sayısına yakın bir değer daha iyi olabilir.
* Gunicorn Timeout Ayarı: Uzun süren istekler için gunicorn --timeout 300 gibi bir ayar ekleyebilirsiniz. Ancak, uzun süren istekler genellikle uygulamanızda bir sorun olduğuna işaret eder.
* Nginx Önbellekleme: Nginx’i sık erişilen statik dosyalar veya nadiren değişen dinamik içerikler için önbellekleme yapacak şekilde yapılandırabilirsiniz.
* Statik Dosyalar İçin CDN: Eğer uygulamanız çok sayıda statik dosya barındırıyorsa ve küresel bir kitleye hitap ediyorsa, statik dosyaları bir CDN (Content Delivery Network) üzerinden sunmak performansı önemli ölçüde artırabilir.
* Veritabanı Optimizasyonu: Uygulama performansının çoğu zaman veritabanı sorgularından kaynaklandığı unutulmamalıdır. Veritabanı indeksleri, sorgu optimizasyonu ve bağlantı havuzları kullanmak performansı artırır.
* Loglama ve İzleme: Uygulamanızın, Gunicorn’ın ve Nginx’in loglarını düzenli olarak izleyin. Prometheus, Grafana, ELK Stack gibi araçlarla sistem kaynaklarını ve uygulama metriklerini izlemek, performans darboğazlarını tespit etmenize yardımcı olur.
* Gzip Sıkıştırma: Nginx yapılandırmanıza Gzip sıkıştırmayı etkinleştiren yönergeler ekleyerek bant genişliği kullanımını azaltabilir ve yükleme sürelerini hızlandırabilirsiniz.
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
* Soket Yeri: Unix soketi yerine TCP soketi kullanmayı düşünebilirsiniz (--bind 127.0.0.1:8000). Bu, Gunicorn ve Nginx’in farklı sunucularda çalıştığı durumlarda gereklidir. Aynı sunucuda ise Unix soketleri genellikle daha hızlıdır.
Sık Karşılaşılan Sorunlar ve Çözümleri
Dağıtım sürecinde karşılaşılabilecek bazı yaygın sorunlar ve bunların çözümleri:
* 502 Bad Gateway Hatası:
* Neden: Nginx, Gunicorn’a istek gönderemiyor veya Gunicorn’dan geçerli bir yanıt alamıyor.
* Çözüm:
* Gunicorn servisinin çalışıp çalışmadığını kontrol edin: sudo systemctl status myproject.
* Gunicorn loglarını kontrol edin: sudo journalctl -u myproject.
* Gunicorn soket dosyasının doğru yerde ve doğru izinlerle oluşturulduğundan emin olun: ls -l /var/www/myproject/myproject.sock.
* Nginx yapılandırmasındaki proxy_pass yönergesinin soket yolunu doğru işaret ettiğinden emin olun.
* Gunicorn’ın yeterli belleğe sahip olduğundan veya uygulamanızın başlatılırken bir hatayla karşılaşmadığından emin olun.
* 500 Internal Server Error Hatası:
* Neden: Python uygulamanızda bir hata (istisna) meydana geldi.
* Çözüm:
* Gunicorn servisinin loglarını kontrol edin: sudo journalctl -u myproject. Genellikle Python traceback’leri burada görünür.
* Uygulamanızı geliştirme ortamında debug=True ile çalıştırarak hatayı yeniden üretmeye çalışın.
* Statik Dosyaların Yüklenmemesi (404 Not Found):
* Neden: Nginx, statik dosyalarınızı bulamıyor veya doğru şekilde yapılandırılmamış.
* Çözüm:
* Nginx yapılandırmasındaki location /static/ bloğunun doğru alias yolunu işaret ettiğinden emin olun.
* Statik dosyaların gerçekten belirtilen yolda (/var/www/myproject/static/) bulunduğundan emin olun.
* Dosya ve dizin izinlerini kontrol edin. Nginx’in statik dosyalara erişim izni olmalı (sudo chown -R www-data:www-data /var/www/myproject/static).
* İzin Sorunları:
* Neden: Gunicorn veya Nginx, belirli dosyalara veya dizinlere erişim iznine sahip değil.
* Çözüm:
* Proje dizininin ve soket dosyasının www-data grubuna ait olduğundan ve okuma/yazma izinlerine sahip olduğundan emin olun:
sudo chown -R your_username:www-data /var/www/myproject
sudo chmod -R 775 /var/www/myproject
sudo chmod g+s /var/www/myproject # Yeni dosyaların aynı grup izinleriyle oluşturulmasını sağlar
* Gunicorn servis dosyasındaki User ve Group ayarlarının doğru olduğundan emin olun.
* Port Çakışmaları:
* Neden: Başka bir servis (örneğin Apache) zaten Nginx’in dinlemeye çalıştığı portu (80 veya 443) kullanıyor.
* Çözüm:
* Hangi servislerin hangi portları kullandığını kontrol edin: sudo netstat -tulnp.
* Çakışan servisi durdurun veya Nginx’in farklı bir port dinlemesini sağlayın (genellikle önerilmez).
Sonuç
Python WSGI uygulamalarını Gunicorn HTTP sunucusu ve Nginx ters proxy ile dağıtmak, modern web uygulamaları için kanıtlanmış, güvenilir ve yüksek performanslı bir çözümdür. Bu makale, WSGI’nin temel prensiplerinden başlayarak, Gunicorn ve Nginx’in rollerini, dağıtım mimarisini ve adım adım kurulum ile yapılandırma süreçlerini detaylı bir şekilde açıklamıştır.
Bu rehberdeki adımları takip ederek, Python tabanlı Flask veya Django uygulamalarınızı üretim ortamında güvenli, ölçeklenebilir ve verimli bir şekilde çalıştırabilirsiniz. Nginx’in statik dosya sunumu, SSL sonlandırma ve yük dengeleme yetenekleri ile Gunicorn’ın sağlam WSGI sunucu işlevselliğini birleştirerek, uygulamanızın yüksek trafik yükleri altında bile sorunsuz çalışmasını sağlayacak güçlü bir altyapı oluşturmuş olursunuz.
Unutmayın ki dağıtım süreci, uygulamanın kendisi kadar önemlidir. Doğru yapılandırma, performans optimizasyonları ve düzenli izleme, uygulamanızın uzun vadeli başarısı için kritik öneme sahiptir. Bu temel bilgileri edinerek, Python web geliştirme ve dağıtım yolculuğunuzda önemli bir adım atmış olacaksınız. Gelecekte, Docker konteynerizasyonu veya Kubernetes gibi daha gelişmiş dağıtım yöntemlerini keşfederek bu mimariyi daha da ileriye taşıyabilirsiniz.