Django Uygulamalarını uWSGI ve Nginx ile Ubuntu 14.04 Üzerinde Dağıtma
Giriş
Web uygulamalarının geliştirilmesi kadar, bu uygulamaların üretim ortamında sorunsuz bir şekilde çalışır hale getirilmesi de büyük önem taşır. Django, Python tabanlı popüler bir web çatısıdır ve hızlı geliştirme süreçleri sunar. Ancak, Django’nun kendisi bir web sunucusu değildir; geliştirme aşamasında kullanılan dahili sunucu, üretim ortamı için tasarlanmamıştır. Üretim ortamında Django uygulamalarını yüksek performans, güvenlik ve ölçeklenebilirlik ile sunmak için genellikle bir WSGI (Web Server Gateway Interface) sunucusu (uWSGI gibi) ve bir ters proxy sunucusu (Nginx gibi) kullanılır.
Bu makalede, Django uygulamalarını Ubuntu 14.04 işletim sistemi üzerinde uWSGI ve Nginx kullanarak nasıl dağıtacağınızı adım adım detaylı bir şekilde inceleyeceğiz. Ubuntu 14.04, eski bir LTS (Uzun Süreli Destek) sürümü olmasına rağmen, bazı kurumsal veya özel projelerde hala kullanılıyor olabilir. Bu rehber, bu özel senaryoya odaklanarak, her bir bileşenin kurulumu, yapılandırması ve birbiriyle entegrasyonu hakkında kapsamlı bilgi sunacaktır. Nginx, gelen HTTP isteklerini karşılayacak, statik dosyaları doğrudan sunacak ve dinamik istekleri uWSGI’ye yönlendirecektir. uWSGI ise Django uygulamanız ile Nginx arasında bir köprü görevi görerek, Django’nun WSGI arayüzünü kullanarak istekleri işleyecek ve yanıtları Nginx’e geri gönderecektir. Bu mimari, uygulamanızın performansını artırırken, kaynak kullanımını optimize etmenize ve daha güvenli bir ortam sağlamanıza yardımcı olur.
Ön Gereksinimler
Bu rehbere başlamadan önce, aşağıdaki ön gereksinimlerin yerine getirilmiş olduğundan emin olmalısınız:
Ubuntu 14.04 Sunucusu
Uzak bir Ubuntu 14.04 sunucusuna (örneğin, bir VPS veya bulut sunucusu) sahip olmalısınız. Tüm komutlar, bu sunucu üzerinde root yetkilerine sahip bir kullanıcı veya sudo kullanabilen bir kullanıcı tarafından çalıştırılacaktır.
SSH Erişimi
Sunucunuza SSH üzerinden erişebilmelisiniz. Genellikle, bir terminal veya PuTTY gibi bir SSH istemcisi kullanarak sunucunuza bağlanılır.
Python ve pip
Ubuntu 14.04 genellikle Python 2.7 ile gelir. Django’nun modern sürümleri Python 3 gerektirir. Bu rehberde Python 3 kullanımına odaklanacağız, bu nedenle Python 3 ve onun paket yöneticisi pip’in kurulu olması önemlidir.
Virtualenv
Python projeleri için sanal ortamlar (virtual environments) kullanmak iyi bir uygulamadır. Bu, projenizin bağımlılıklarını sistem genelindeki Python paketlerinden izole etmenizi sağlar ve bağımlılık çakışmalarını önler.
Örnek Bir Django Uygulaması
Dağıtmak istediğiniz bir Django uygulamasının hazır olması gerekir. Bu makale, bir Django uygulamasının zaten mevcut olduğunu ve sunucuya aktarıldığını varsayacaktır. Eğer henüz bir uygulamanız yoksa, basit bir “Hello World” uygulaması oluşturarak başlayabilirsiniz.
Sistem Güncelleme ve Temel Bağımlılıkların Kurulumu
İlk adım olarak, sunucunuzun paket listesini güncellemeli ve temel geliştirme araçlarını kurmalısınız.
Sistem Paketlerini Güncelleme
Sunucunuzdaki paket bilgilerini güncelleyin ve yüklü paketleri en son sürümlerine yükseltin:
sudo apt-get update
sudo apt-get upgrade -y
Python 3 ve pip Kurulumu
Ubuntu 14.04, varsayılan olarak Python 2.7 ile gelir. Modern Django sürümleri Python 3 gerektirdiğinden, Python 3’ü ve pip’ini kuralım:
sudo apt-get install -y python3 python3-pip python3-dev
python3-dev paketi, uWSGI gibi bazı Python paketlerinin derlenmesi için gerekli olan geliştirme başlıklarını ve kütüphanelerini içerir.
Nginx Kurulumu
Nginx, performanslı bir web sunucusu ve ters proxy sunucusudur. Kurulumu oldukça basittir:
sudo apt-get install -y nginx
Nginx’in başarılı bir şekilde kurulduğunu kontrol etmek için tarayıcınızdan sunucunuzun IP adresine gidebilirsiniz. “Welcome to nginx!” mesajını görmelisiniz.
Virtualenv Kurulumu
Sanal ortamları yönetmek için virtualenv aracını kurun:
sudo pip3 install virtualenv
Bu komut, virtualenv‘i Python 3’ün pip’i ile kuracaktır.
Django Projesi ve Sanal Ortam Kurulumu
Şimdi Django projenizi sunucuda yapılandırma zamanı.
Proje Dizini Oluşturma ve Sanal Ortam Kurulumu
Django projeniz için bir dizin oluşturun ve bu dizine gidin. Bu rehberde /var/www/myproject yolunu kullanacağız. Siz kendi projenizin adını ve yolunu kullanabilirsiniz.
sudo mkdir -p /var/www/myproject
cd /var/www/myproject
Bu dizinde, projeniz için bir sanal ortam oluşturun ve etkinleştirin:
virtualenv venv -p python3
source venv/bin/activate
Artık terminalinizde (venv) ön eki görmelisiniz, bu da sanal ortamın etkin olduğunu gösterir.
Django ve Diğer Bağımlılıkları Kurma
Sanal ortam etkinleştirildikten sonra, Django’yu ve projenizin diğer bağımlılıklarını (örneğin, veritabanı sürücüleri gibi) kurabilirsiniz.
Eğer requirements.txt dosyanız varsa:
pip install -r requirements.txt
Eğer yoksa, temel Django kurulumu için:
pip install django
Bu rehber için, basit bir Django projesi oluşturduğunuzu varsayalım:
django-admin startproject myproject .
python manage.py startapp myapp
Ardından, veritabanı geçişlerini uygulayın:
python manage.py migrate
Django Projesi Yapılandırması
Django projenizin settings.py dosyasını düzenlemeniz gerekecek.
1. ALLOWED_HOSTS: Sunucunuzun IP adresini veya alan adınızı ekleyin.
# myproject/settings.py
ALLOWED_HOSTS = ['your_server_ip_or_domain.com', 'localhost']
2. STATIC_ROOT: Nginx’in statik dosyaları doğrudan sunabilmesi için tüm statik dosyaların toplanacağı bir dizin belirtin. Bu dizin, projenizin kök dizini içinde olabilir.
# myproject/settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')
3. DEBUG: Üretim ortamında DEBUG = False olarak ayarlandığından emin olun.
# myproject/settings.py
DEBUG = False
settings.py dosyasını kaydettikten sonra, statik dosyaları belirtilen STATIC_ROOT dizinine toplayın:
python manage.py collectstatic
Bu işlem, STATIC_ROOT dizinini oluşturacak ve tüm statik dosyaları oraya kopyalayacaktır.
uWSGI Kurulumu ve Yapılandırması
uWSGI, Django uygulamanız ile Nginx arasında bir arayüz görevi görecektir.
uWSGI Kurulumu
Sanal ortamınız etkin durumdayken uWSGI’yi kurun:
pip install uwsgi
uWSGI’yi Test Etme
uWSGI’nin Django projenizle düzgün çalışıp çalışmadığını test edelim. Proje kök dizinindeyken (yani manage.py dosyasının olduğu dizinde) aşağıdaki komutu çalıştırın:
uwsgi --http :8000 --module myproject.wsgi
Burada myproject sizin Django projenizin adıdır (yani settings.py dosyasının bulunduğu dizinin adı). Tarayıcınızdan http://your_server_ip:8000 adresine giderek Django uygulamanızın çalıştığını görmelisiniz. Eğer görüyorsanız, uWSGI başarılı bir şekilde Django uygulamanıza bağlanmıştır. Testi bitirmek için Ctrl+C tuşlarına basarak uWSGI sunucusunu durdurun.
uWSGI Yapılandırma Dosyası Oluşturma
uWSGI’yi bir komutla çalıştırmak yerine, daha karmaşık yapılandırmaları yönetmek için bir .ini dosyası kullanmak daha iyidir. Proje dizininizde uwsgi.ini adında bir dosya oluşturalım:
nano /var/www/myproject/uwsgi.ini
Dosyanın içeriği aşağıdaki gibi olmalıdır:
[uwsgi]
Django projesinin kök dizini
chdir = /var/www/myproject
Django'nun WSGI modülü
module = myproject.wsgi:application
Sanal ortam yolu
home = /var/www/myproject/venv
Master process'i etkinleştir
master = true
Çalışan process sayısı
processes = 5
Unix soketi kullan (Nginx ile iletişim için)
socket = /var/www/myproject/myproject.sock
Soketin izinleri (Nginx'in erişebilmesi için)
chmod-socket = 664
Processlerin kapanmasında otomatik temizlik yap
vacuum = true
Her process için maksimum istek sayısı (bellek sızıntılarını önlemek için)
max-requests = 5000
Log dosyası
logto = /var/log/uwsgi/myproject.log
Pid dosyası
pidfile = /var/run/uwsgi/myproject.pid
Yukarıdaki yapılandırmayı kendi projenizin adlarına ve yollarına göre düzenlemeyi unutmayın. Özellikle module satırındaki myproject kısmını kendi Django projenizin adıyla değiştirmeniz gerekmektedir. socket ve pidfile için dizinlerin (/var/run/uwsgi, /var/log/uwsgi) var olduğundan emin olun, yoksa oluşturun:
sudo mkdir -p /var/run/uwsgi
sudo mkdir -p /var/log/uwsgi
sudo chown -R www-data:www-data /var/log/uwsgi # Nginx kullanıcısının log yazabilmesi için
sudo chown -R www-data:www-data /var/run/uwsgi # Nginx kullanıcısının pid yazabilmesi için (veya uwsgi kullanıcısı oluşturun)
Bu adımlar, Nginx’in uWSGI soketine ve log dosyalarına erişimini sağlamak için önemlidir.
uWSGI’yi Bir Sistem Servisi Olarak Çalıştırma (Upstart)
Ubuntu 14.04, sistem servislerini yönetmek için Upstart kullanır. uWSGI’nin sunucu başladığında otomatik olarak başlaması ve arka planda çalışması için bir Upstart yapılandırma dosyası oluşturalım.
sudo nano /etc/init/uwsgi.conf
Dosyanın içeriği aşağıdaki gibi olmalıdır:
description "uWSGI server for myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
Projenizin dizinine git
chdir /var/www/myproject
Sanal ortamı etkinleştir
exec /var/www/myproject/venv/bin/uwsgi --ini /var/www/myproject/uwsgi.ini
Alternatif olarak, eğer uwsgi global olarak kurulduysa veya PATH'te ise:
exec /usr/local/bin/uwsgi --ini /var/www/myproject/uwsgi.ini
exec satırındaki uwsgi yolunun doğru olduğundan emin olun. Eğer sanal ortam içindeki uwsgi‘yi kullanmak istiyorsanız, tam yolunu belirtmelisiniz (/var/www/myproject/venv/bin/uwsgi). Eğer pip install uwsgi komutunu sanal ortam içinde çalıştırdıysanız, bu yol geçerli olacaktır. Eğer sudo pip3 install uwsgi ile sistem geneline kurduysanız, /usr/local/bin/uwsgi gibi bir yol doğru olabilir.
Şimdi uWSGI servisini başlatın:
sudo start uwsgi
Servisin durumunu kontrol edebilirsiniz:
sudo status uwsgi
Eğer her şey yolundaysa, uwsgi start/running gibi bir mesaj görmelisiniz. Ayrıca /var/log/uwsgi/myproject.log dosyasını kontrol ederek herhangi bir hata olup olmadığını görebilirsiniz.
Nginx Kurulumu ve Yapılandırması
Nginx, gelen istekleri karşılayacak, statik dosyaları sunacak ve dinamik istekleri uWSGI’ye yönlendirecektir.
Nginx Yapılandırma Dosyası Oluşturma
Nginx için yeni bir site yapılandırma dosyası oluşturalım. Bu dosyayı /etc/nginx/sites-available/ dizininde saklayacağız.
sudo nano /etc/nginx/sites-available/myproject
Dosyanın içeriği aşağıdaki gibi olmalıdır:
server {
listen 80;
server_name your_server_ip_or_domain.com; # Sunucunuzun IP adresi veya alan adı
# Statik dosyalar için konum
location /static/ {
alias /var/www/myproject/static_files/; # Django'nun collectstatic ile topladığı dizin
expires 30d; # Tarayıcı önbellekleme
}
# Medya dosyaları için konum (isteğe bağlı, eğer uygulamanız medya dosyaları kullanıyorsa)
# location /media/ {
# alias /var/www/myproject/media/;
# expires 30d;
# }
# Tüm diğer istekleri uWSGI'ye yönlendir
location / {
include uwsgi_params; # uWSGI için gerekli parametreleri içerir
uwsgi_pass unix:///var/www/myproject/myproject.sock; # uWSGI soket dosyası
}
# Hata sayfaları
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server_name kısmını kendi sunucunuzun IP adresi veya alan adıyla değiştirmeyi unutmayın. alias yönergelerindeki yolların doğru olduğundan emin olun.
Yapılandırmayı Etkinleştirme ve Test Etme
Yeni yapılandırma dosyasını etkinleştirmek için sites-enabled dizinine sembolik bir bağ oluşturun:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
Varsayılan Nginx yapılandırmasını devre dışı bırakmak iyi bir uygulamadır:
sudo rm /etc/nginx/sites-enabled/default
Nginx yapılandırmanızda herhangi bir sözdizimi hatası olup olmadığını kontrol edin:
sudo nginx -t
Eğer test is successful mesajını alırsanız, Nginx’i yeniden başlatarak yeni yapılandırmayı uygulayın:
sudo service nginx restart
Şimdi tarayıcınızdan sunucunuzun IP adresine veya alan adına giderek Django uygulamanızın çalıştığını görmelisiniz. Statik dosyalarınızın (CSS, JS, resimler) da düzgün yüklendiğinden emin olun.
Güvenlik ve İyileştirmeler
Uygulamanızın üretimde daha güvenli ve verimli çalışması için ek adımlar atabilirsiniz.
Güvenlik Duvarı (UFW) Yapılandırması
Ubuntu’da basit bir güvenlik duvarı olan UFW (Uncomplicated Firewall) bulunur. Yalnızca gerekli portları açarak sunucunuzun güvenliğini artırabilirsiniz.
sudo ufw enable # Güvenlik duvarını etkinleştir
sudo ufw allow ssh # SSH erişimine izin ver (22. port)
sudo ufw allow 'Nginx HTTP' # HTTP (80. port) erişimine izin ver
sudo ufw allow 'Nginx HTTPS' # Eğer SSL kullanacaksanız HTTPS (443. port) erişimine izin ver
sudo ufw status # Güvenlik duvarı durumunu kontrol et
SSL/TLS Kurulumu (Let’s Encrypt ile)
Web sitenizi HTTPS üzerinden sunmak, güvenlik ve kullanıcı güveni açısından kritik öneme sahiptir. Let’s Encrypt, ücretsiz SSL/TLS sertifikaları sağlar. Ubuntu 14.04 üzerinde Certbot kurulumu biraz farklılık gösterebilir.
1. Certbot Kurulumu: Ubuntu 14.04 için PPA eklemek gerekebilir:
sudo apt-get update
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:certbot/certbot -y
sudo apt-get update
sudo apt-get install -y python-certbot-nginx
Eğer Python 3 kullanıyorsanız python3-certbot-nginx paketini denemeniz gerekebilir, ancak PPA’nın 14.04 için Python 3 desteği sınırlı olabilir. python-certbot-nginx genellikle Python 2.7 ile çalışır.
2. Sertifika Alma:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
Certbot, Nginx yapılandırmanızı otomatik olarak güncelleyecek ve HTTP isteklerini HTTPS’ye yönlendirecektir. Sertifika süresi dolduğunda otomatik yenileme için bir cron işi de ayarlayacaktır.
uWSGI ve Nginx Logları
Uygulamanızda veya sunucunuzda sorunlar çıktığında, log dosyaları sorun giderme için hayati öneme sahiptir.
* uWSGI logları: /var/log/uwsgi/myproject.log dosyasını kontrol edin.
* Nginx erişim logları: /var/log/nginx/access.log
* Nginx hata logları: /var/log/nginx/error.log
Bu log dosyalarını düzenli olarak kontrol etmek, potansiyel sorunları erken tespit etmenize yardımcı olacaktır.
Sorun Giderme
Kurulum sırasında veya sonrasında karşılaşabileceğiniz bazı yaygın sorunlar ve çözümleri:
1. Nginx 502 Bad Gateway Hatası:
* Bu genellikle Nginx’in uWSGI’ye bağlanamadığı anlamına gelir.
* Çözüm:
* uWSGI servisinin çalıştığından emin olun (sudo status uwsgi).
* uWSGI soket dosyasının (/var/www/myproject/myproject.sock) var olduğundan ve Nginx kullanıcısının (genellikle www-data) bu sokete erişim izinlerine sahip olduğundan emin olun. Gerekirse sudo chown www-data:www-data /var/www/myproject/myproject.sock komutunu çalıştırın.
* uWSGI loglarını (/var/log/uwsgi/myproject.log) kontrol edin. Django uygulama hataları burada görünebilir.
* Nginx hata loglarını (/var/log/nginx/error.log) kontrol edin.
2. Statik Dosyalar Yüklenmiyor:
* Nginx’in statik dosyaları bulamadığı veya doğru şekilde yapılandırılmadığı anlamına gelir.
* Çözüm:
* python manage.py collectstatic komutunu çalıştırdığınızdan ve STATIC_ROOT dizininin (/var/www/myproject/static_files/) var olduğundan emin olun.
* Nginx yapılandırmanızdaki location /static/ bloğunun doğru alias yolunu gösterdiğinden emin olun.
* Statik dosyaların dosya izinlerini kontrol edin. Nginx kullanıcısının bu dosyalara okuma erişimi olmalıdır (sudo chmod -R 755 /var/www/myproject/static_files).
* Nginx’i yeniden başlattığınızdan emin olun (sudo service nginx restart).
3. Django Uygulama Hataları (500 Internal Server Error):
* Bu, Django uygulamanızın kendisinde bir hata olduğu anlamına gelir.
* Çözüm:
* uWSGI loglarını (/var/log/uwsgi/myproject.log) kontrol edin. Django traceback’leri genellikle burada görünür.
* Django settings.py dosyasındaki DEBUG = False ayarını geçici olarak DEBUG = True yaparak daha detaylı hata mesajları alabilirsiniz (yalnızca sorun giderme amaçlı ve kısa süreliğine yapılmalı, üretimde False olmalıdır).
* Sanal ortamın doğru etkinleştirildiğinden ve tüm bağımlılıkların yüklendiğinden emin olun.
4. uwsgi.conf Upstart Servisi Başlamıyor:
* Upstart yapılandırma dosyasındaki sözdizimi hataları veya yanlış yollar nedeniyle olabilir.
* Çözüm:
* /etc/init/uwsgi.conf dosyasını dikkatlice kontrol edin. Özellikle exec satırındaki uWSGI yolunun ve .ini dosyasının yolunun doğru olduğundan emin olun.
* sudo init-checkconf /etc/init/uwsgi.conf komutunu çalıştırarak yapılandırma dosyasını kontrol edin.
* sudo start uwsgi komutunun çıktısını ve /var/log/upstart/uwsgi.log (eğer varsa) dosyasını kontrol edin.
Bu sorun giderme adımları, çoğu yaygın dağıtım sorununu çözmenize yardımcı olacaktır. Her zaman log dosyalarını kontrol etmekle başlayın; onlar size sorunun kökeni hakkında en iyi ipuçlarını verecektir.
Sonuç
Bu kapsamlı rehberde, Django uygulamanızı Ubuntu 14.04 üzerinde uWSGI ve Nginx kullanarak nasıl dağıtacağınızı adım adım öğrendiniz. Süreç, temel sistem güncelleştirmelerinden başlayarak, Django projesinin hazırlanması, uWSGI’nin kurulumu ve bir sistem servisi olarak yapılandırılması, Nginx’in ters proxy ve statik dosya sunucusu olarak ayarlanması ve son olarak güvenlik iyileştirmeleri ve sorun giderme adımlarını içeriyordu.
Bu mimari, Django uygulamanızın üretim ortamında yüksek performans, güvenilirlik ve ölçeklenebilirlik ile çalışmasını sağlar. Nginx, eşzamanlı bağlantıları verimli bir şekilde yönetirken, statik dosyaları doğrudan sunarak Django ve uWSGI üzerindeki yükü azaltır. uWSGI ise Python uygulamanız ile Nginx arasında sağlam ve hızlı bir köprü görevi görür.
Unutmayın ki Ubuntu 14.04 artık resmi olarak desteklenmeyen eski bir sürümdür. Yeni projeler için daha güncel bir LTS sürümü (örneğin, Ubuntu 20.04 veya 22.04) kullanmanız şiddetle tavsiye edilir. Ancak, mevcut bir Ubuntu 14.04 ortamında Django uygulamalarını dağıtmanız gerekiyorsa, bu rehber size sağlam bir yol haritası sunacaktır. Uygulamanızın sorunsuz çalışmaya devam etmesi için düzenli bakım, güvenlik güncellemeleri ve log takibi yapmayı ihmal etmeyin.