Takip et

Django Uygulamasını mod_wsgi, Apache ve virtualenv ile Debian VPS Üzerinde Çalıştırmak

Web uygulamalarını üretim ortamında çalıştırmak, geliştirme ortamından farklı zorluklar barındırır. Performans, güvenlik, ölçeklenebilirlik ve kararlılık gibi faktörler devreye girer.

Django Uygulamasını mod_wsgi, Apache ve virtualenv ile Debian VPS Üzerinde Çalıştırmak

Web uygulamalarını üretim ortamında çalıştırmak, geliştirme ortamından farklı zorluklar barındırır. Performans, güvenlik, ölçeklenebilirlik ve kararlılık gibi faktörler devreye girer. Django gibi güçlü bir web çatısını, Apache gibi köklü ve kararlı bir web sunucusuyla, mod_wsgi modülü aracılığıyla entegre etmek, bu zorlukların üstesinden gelmek için sıkça tercih edilen bir çözümdür. Üstelik, projenin bağımlılıklarını izole etmek ve sistem Python’unu temiz tutmak için virtualenv kullanmak, modern geliştirme pratiklerinin olmazsa olmazıdır. Bu makale, Debian tabanlı bir VPS üzerinde Django uygulamanızı mod_wsgi ve Apache ikilisiyle, virtualenv kullanarak nasıl kuracağınızı ve yapılandıracağınızı adım adım açıklamaktadır.

Neden Bu Kombinasyon?

Django, Python tabanlı web geliştirmeyi hızlandıran yüksek seviyeli bir çerçevedir. Apache ise yüksek performans, kararlılık ve zengin özellik setine sahip, dünyanın en yaygın kullanılan web sunucularından biridir. mod_wsgi, Apache’nin Python tabanlı WSGI (Web Server Gateway Interface) uygulamalarını çalıştırmasına olanak tanıyan bir Apache modülüdür. Bu üçlünün birleşimi, Django uygulamanız için güvenilir, ölçeklenebilir ve yönetilebilir bir üretim ortamı sunar. virtualenv ise projenizin Python bağımlılıklarını sistem genelindeki Python kurulumundan izole ederek, farklı projelerin farklı bağımlılık versiyonlarıyla çakışmasını engeller ve dağıtımı kolaylaştırır.

Makalenin Amacı

Bu makalenin amacı, Debian VPS üzerinde sıfırdan başlayarak bir Django uygulamasını Apache, mod_wsgi ve virtualenv kullanarak başarılı bir şekilde dağıtmak için gereken tüm adımları, komutları ve yapılandırma örneklerini sağlamaktır. Adımlar, sistem güncellemesinden Apache yapılandırmasına, veritabanı kurulumundan statik dosya yönetimine kadar geniş bir yelpazeyi kapsayacaktır.

Ön Gereksinimler

Kuruluma başlamadan önce aşağıdaki ön gereksinimleri karşıladığınızdan emin olun:

Debian VPS Erişimi

Bir Debian tabanlı (örneğin Debian 11 veya 12) Sanal Özel Sunucuya (VPS) sahip olmalısınız. SSH aracılığıyla sunucuya erişiminiz ve root kullanıcısı olarak veya sudo yetkilerine sahip bir kullanıcı olarak komut çalıştırma yetkiniz olmalıdır.

Temel Linux Komut Bilgisi

Linux komut satırı (terminal) ile temel düzeyde bilgi sahibi olmanız beklenmektedir. Dosya sisteminde gezinme, dosya oluşturma/düzenleme, paket yükleme gibi temel işlemleri yapabilmelisiniz.

Hazır Bir Django Projesi

Dağıtımı yapılacak bir Django projeniz olmalıdır. Bu, mevcut bir projeniz olabileceği gibi, test amaçlı basit bir Django projesi de olabilir. Projenizin bir requirements.txt dosyası olması, bağımlılıkları kolayca kurmanızı sağlayacaktır.

Sistem Güncelleme ve Gerekli Paketlerin Kurulumu

Herhangi bir kuruluma başlamadan önce sisteminizi güncel tutmak iyi bir uygulamadır. Ardından, Apache, Python geliştirme araçları ve mod_wsgi gibi temel bileşenleri kuracağız.

Sistem Güncelleme

Sunucunuzdaki paket listelerini güncelleyin ve mevcut paketleri yükseltin:

sudo apt update
sudo apt upgrade -y

Apache2 Kurulumu

Apache web sunucusunu kurun:

sudo apt install apache2 -y

Kurulumdan sonra Apache’nin çalıştığını kontrol edebilirsiniz:

sudo systemctl status apache2

Tarayıcınızdan sunucunuzun IP adresine giderek “Apache2 Debian Default Page” sayfasını görmelisiniz.

Python Geliştirme Araçları ve virtualenv

Python virtualenv ortamı oluşturmak için gerekli olan python3-venv paketini ve bazı Python paketlerini derlemek için ihtiyaç duyulan geliştirme araçlarını kurun:

sudo apt install python3-venv python3-dev build-essential -y

mod_wsgi Kurulumu

Apache’nin Python WSGI uygulamalarını çalıştırmasını sağlayan mod_wsgi modülünü kurun. Debian’da bu genellikle libapache2-mod-wsgi-py3 paketi aracılığıyla sağlanır:

sudo apt install libapache2-mod-wsgi-py3 -y

Bu paket, modülü otomatik olarak etkinleştirir. Etkinleştirilip etkinleştirilmediğini kontrol etmek için:

sudo a2enmod wsgi
sudo systemctl restart apache2

Zaten etkinse, komut size bunu bildirecektir.

PostgreSQL İstemci Kütüphaneleri (İsteğe Bağlı)

Eğer projeniz PostgreSQL veritabanı kullanıyorsa, Python’ın PostgreSQL ile etkileşim kurmasını sağlayan psycopg2 kütüphanesini derlemek için gerekli olan istemci kütüphanelerini kurmanız gerekir:

sudo apt install libpq-dev -y

Python virtualenv Ortamının Oluşturulması ve Django Projesinin Hazırlanması

Şimdi projenizi barındıracağınız dizini oluşturacak ve bir virtualenv ortamı kuracaksınız.

Proje Dizini Oluşturma

Web projeleri için genellikle /var/www/ dizini kullanılır. Projeniz için bir dizin oluşturun ve gerekli izinleri ayarlayın:

sudo mkdir -p /var/www/myproject
sudo chown -R $USER:$USER /var/www/myproject
cd /var/www/myproject

myproject yerine kendi proje adınızı kullanın. $USER, o anki SSH kullanıcınızı temsil eder.

virtualenv Oluşturma ve Etkinleştirme

Oluşturduğunuz proje dizini içinde bir virtualenv ortamı oluşturun:

python3 -m venv venv

virtualenv’i etkinleştirin:

source venv/bin/activate

Komut isteminizin başında (venv) ibaresini görmelisiniz. Bu, virtualenv’in etkin olduğunu gösterir.

Django Projesini Sunucuya Aktarma

Django projenizi sunucuya aktarmanın birkaç yolu vardır:

  1. Git ile Klonlama: Eğer projeniz bir Git deposundaysa, bu en kolay yoldur.
  2. (venv) git clone  .
    
  3. SCP ile Kopyalama: Yerel makinenizden sunucuya kopyalayabilirsiniz.
  4. # Yerel makinenizde
    scp -r /path/to/your/local/project/ user@your_vps_ip:/var/www/myproject/
    

Proje dosyalarınızın /var/www/myproject/ dizini altında olduğundan emin olun. Örneğin, manage.py dosyasının /var/www/myproject/manage.py yolunda olması beklenir.

Gerekli Python Paketlerinin Kurulumu

Projenizin bağımlılıklarını requirements.txt dosyasından yükleyin:

(venv) pip install -r requirements.txt

Eğer requirements.txt dosyanız yoksa, Django ve veritabanı sürücüsü gibi temel paketleri manuel olarak kurun:

(venv) pip install Django psycopg2-binary # veya mysqlclient, vb.

Kurulum tamamlandıktan sonra virtualenv’den çıkabilirsiniz:

(venv) deactivate

Apache ve mod_wsgi Yapılandırması

Şimdi Apache’ye Django uygulamanızı nasıl sunacağını öğreteceğiz. Bunun için yeni bir Virtual Host yapılandırma dosyası oluşturacağız.

Apache Site Yapılandırma Dosyası Oluşturma

Apache’nin site yapılandırma dosyaları genellikle /etc/apache2/sites-available/ dizininde bulunur. Projeniz için yeni bir dosya oluşturun:

sudo nano /etc/apache2/sites-available/myproject.conf

Dosyanın içine aşağıdaki içeriği yapıştırın. Kendi proje adınıza, domain adınıza ve dizin yollarınıza göre düzenlemeler yapmayı unutmayın:


    ServerAdmin webmaster@localhost
    ServerName your_domain.com
    ServerAlias www.your_domain.com

    DocumentRoot /var/www/myproject/

    ErrorLog ${APACHE_LOG_DIR}/myproject_error.log
    CustomLog ${APACHE_LOG_DIR}/myproject_access.log combined

    # WSGI yapılandırması
    WSGIDaemonProcess myproject python-home=/var/www/myproject/venv python-path=/var/www/myproject
    WSGIProcessGroup myproject
    WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py

    
        &Require all granted
    

    # Statik dosyalar için Alias
    Alias /static /var/www/myproject/static
    
        Require all granted
    

    # Medya dosyaları için Alias (eğer kullanıyorsanız)
    Alias /media /var/www/myproject/media
    
        Require all granted
    


Açıklamalar:

  • ServerName ve ServerAlias: Alan adınızı (domain) veya sunucunuzun IP adresini buraya yazın.
  • WSGIDaemonProcess myproject python-home=/var/www/myproject/venv python-path=/var/www/myproject:
    • myproject: WSGI süreç grubunun adıdır.
    • python-home: virtualenv’inizin yolunu belirtir. Bu, mod_wsgi’nin projenizin bağımlılıklarını doğru ortamdan yüklemesini sağlar.
    • python-path: Django projenizin kök dizinini belirtir. Bu, Django’nun settings.py ve diğer modülleri bulabilmesini sağlar.
  • WSGIProcessGroup myproject: Bu sanal host için hangi WSGI süreç grubunun kullanılacağını belirtir.
  • WSGIScriptAlias / /var/www/myproject/myproject/wsgi.py: Tüm gelen istekleri (/) Django projenizin wsgi.py dosyasına yönlendirir. İlk myproject, projenizin ana dizini, ikinci myproject ise Django projenizin içindeki ana uygulama dizinidir (settings.py ve wsgi.py‘nin bulunduğu yer). Kendi proje yapınıza göre bu yolu ayarlayın.
  • blokları: Apache’nin belirli dizinlere erişim izinlerini ayarlar.
  • Alias /static ve Alias /media: Django’nun collectstatic komutuyla topladığı statik dosyaları ve kullanıcı tarafından yüklenen medya dosyalarını Apache’nin doğrudan sunmasını sağlar. Bu, Django’nun bu tür dosyaları sunma yükünü hafifletir.

Siteyi Etkinleştirme ve Apache’yi Yeniden Başlatma

Yeni yapılandırma dosyanızı etkinleştirin ve Apache’yi yeniden başlatın:

sudo a2ensite myproject.conf
sudo apache2ctl configtest # Yapılandırma hatası olup olmadığını kontrol edin
sudo systemctl restart apache2

apache2ctl configtest komutu, yapılandırma dosyanızda herhangi bir hata olup olmadığını kontrol etmek için çok önemlidir. Eğer “Syntax OK” çıktısını alırsanız, yapılandırmanızda bir sorun yok demektir.

Django Projesinin Ayarlanması (settings.py, wsgi.py)

Django projenizin üretim ortamına uygun şekilde yapılandırılması gerekmektedir.

settings.py Dosyası

Projenizin settings.py dosyasında aşağıdaki değişiklikleri yapın:

# myproject/settings.py

GÜVENLİK İÇİN DEBUG=False YAPIN!

DEBUG = False

Uygulamanızın erişilebilir olacağı host isimlerini buraya ekleyin

ALLOWED_HOSTS = ['your_domain.com', 'www.your_domain.com', 'your_vps_ip_address']

Statik ve Medya Dosyaları

import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static') # collectstatic buraya toplar MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # Kullanıcı yüklemeleri buraya gider

SECRET_KEY'i gizli tutun. Üretimde asla doğrudan buraya yazmayın!

Ortam değişkeni olarak veya başka bir güvenli yöntemle yükleyin.

Örnek: SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'default-insecure-key')

Önemli: DEBUG = False ayarını üretim ortamında kesinlikle bu şekilde bırakın. Hata ayıklama bilgileri hassas veriler içerebilir. SECRET_KEY‘i doğrudan dosyaya yazmak yerine, ortam değişkenleri (örneğin /etc/apache2/envvars veya .env dosyası ile) aracılığıyla yüklemeniz önerilir.

wsgi.py Dosyası

Django projenizin wsgi.py dosyası genellikle aşağıdaki gibi görünür. Mod_wsgi’nin projenizi doğru şekilde bulabilmesi için bazen sys.path‘e proje kök dizinini eklemek gerekebilir, ancak python-path parametresi ile bu genellikle gereksizdir. Yine de, sorun yaşarsanız aşağıdaki gibi düzenleyebilirsiniz:

# myproject/myproject/wsgi.py

import os
import sys

from django.core.wsgi import get_wsgi_application

Projenizin kök dizinini sys.path'e ekleyin

Bu, wsgi.py dosyasının bulunduğu dizinin bir üst dizini olmalıdır

Eğer Apache yapılandırmanızdaki python-path doğru ise bu satır gereksiz olabilir

sys.path.append('/var/www/myproject') # Kendi proje yolunuza göre düzenleyin

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings') application = get_wsgi_application()

Veritabanı Yapılandırması

Çoğu Django projesi bir veritabanına ihtiyaç duyar. Bu bölümde PostgreSQL kurulumunu ele alacağız, ancak adımlar diğer veritabanları (MySQL/MariaDB) için de benzerdir.

PostgreSQL Kurulumu

sudo apt install postgresql postgresql-contrib -y

PostgreSQL varsayılan olarak postgres adında bir kullanıcı oluşturur. Bu kullanıcı ile veritabanı işlemleri yapabilirsiniz:

sudo -u postgres psql

PSQL istemcisinde, projeniz için bir veritabanı ve kullanıcı oluşturun:

CREATE DATABASE myprojectdb;
CREATE USER myprojectuser WITH PASSWORD 'your_secure_password';
ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
\q

myprojectdb, myprojectuser ve your_secure_password değerlerini kendi tercihlerinizle değiştirin.

Django settings.py’de Veritabanı Ayarları

settings.py dosyanızda veritabanı ayarlarınızı güncelleyin:

# myproject/settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'myprojectdb',
        'USER': 'myprojectuser',
        'PASSWORD': 'your_secure_password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

Veritabanı Göçleri ve Süper Kullanıcı Oluşturma

virtualenv’inizi tekrar etkinleştirerek veritabanı göçlerini çalıştırın ve bir süper kullanıcı oluşturun:

cd /var/www/myproject
source venv/bin/activate
python manage.py migrate
python manage.py collectstatic --noinput # Statik dosyaları topla
python manage.py createsuperuser
deactivate

Statik ve Medya Dosyalarının Yönetimi

Django, üretim ortamında statik ve medya dosyalarını doğrudan sunmaz. Bu görev için Apache gibi bir web sunucusu kullanılır.

Statik Dosyaların Toplanması

python manage.py collectstatic komutu, projenizdeki tüm statik dosyaları (Django admin, uygulamalarınızın statik dosyaları vb.) STATIC_ROOT ayarında belirttiğiniz dizine toplar. Bu dizin için Apache yapılandırmanızda Alias tanımladık.

cd /var/www/myproject
source venv/bin/activate
python manage.py collectstatic --noinput # --noinput, onay istemeden toplar
deactivate

Dizin İzinleri

Apache’nin statik ve medya dosyalarına erişebilmesi için doğru dosya ve dizin izinlerine sahip olduğundan emin olun. Apache genellikle www-data kullanıcısı altında çalışır.

sudo chown -R www-data:www-data /var/www/myproject/static
sudo chown -R www-data:www-data /var/www/myproject/media # Medya dosyaları için
sudo chmod -R 755 /var/www/myproject/static
sudo chmod -R 755 /var/www/myproject/media

Eğer Apache’nin medya dosyalarını yazması gerekiyorsa (kullanıcı yüklemeleri gibi), media dizinine yazma izni de vermeniz gerekebilir:

sudo chmod -R 775 /var/www/myproject/media

Bu izinleri verirken dikkatli olun ve sadece gerçekten gerekli olan dizinlere yazma izni verin.

Güvenlik İpuçları

Üretim ortamında Django uygulamanızın güvenliğini sağlamak kritik öneme sahiptir.

DEBUG = False ve ALLOWED_HOSTS

settings.py dosyasında DEBUG = False olarak ayarlandığından ve ALLOWED_HOSTS listesinin yalnızca uygulamanızın erişilebilir olmasını istediğiniz alan adlarını içerdiğinden emin olun.

SECRET_KEY’in Gizlenmesi

SECRET_KEY, Django’nun güvenlik mekanizmalarının temelidir. Bu anahtarı asla doğrudan settings.py dosyasında bırakmayın. Ortam değişkenleri, bir .env dosyası (python-dotenv ile okunur) veya Apache’nin SetEnv yönergesi gibi yöntemlerle yükleyin.

Apache SetEnv örneği (myproject.conf içine):

SetEnv DJANGO_SECRET_KEY "your_very_long_and_secret_key"

Ve settings.py içinde:

import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
if not SECRET_KEY:
    raise ImproperlyConfigured("DJANGO_SECRET_KEY environment variable not set.")

SSL/TLS (HTTPS) Kullanımı

Tüm üretim uygulamaları HTTPS kullanmalıdır. Let’s Encrypt ve Certbot, ücretsiz SSL sertifikaları almanızı ve otomatik olarak yapılandırmanızı sağlar:

sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d your_domain.com -d www.your_domain.com

Bu komutlar, sertifikayı alacak ve Apache yapılandırmanızı otomatik olarak güncelleyecektir.

Güvenlik Duvarı (UFW)

Sadece gerekli portları (80 ve 443) açık tutmak için bir güvenlik duvarı kullanın:

sudo ufw allow 'Apache Full'
sudo ufw enable

Sorun Giderme (Yaygın Hatalar)

Kurulum sırasında veya sonrasında karşılaşabileceğiniz yaygın sorunlar ve çözümleri:

Apache Hata Günlükleri

En önemli sorun giderme aracı Apache hata günlükleridir. Tüm hatalar buraya yazılır:

sudo tail -f /var/log/apache2/myproject_error.log
sudo tail -f /var/log/apache2/error.log

Bu günlükleri izleyerek, Python traceback’lerini veya Apache ile ilgili yapılandırma hatalarını görebilirsiniz.

Dizin/Dosya İzinleri

Permission denied hataları genellikle yanlış dosya veya dizin izinlerinden kaynaklanır. Apache’nin www-data kullanıcısı altında çalıştığını unutmayın ve bu kullanıcının projenizin tüm dosyalarına ve virtualenv’e okuma erişimi olduğundan emin olun.

sudo chown -R www-data:www-data /var/www/myproject
sudo chmod -R 755 /var/www/myproject

Ancak, wsgi.py dosyasının ve tüm Python dosyalarının çalıştırılabilir olması gerekmez, sadece okunabilir olması yeterlidir.

virtualenv Aktivasyonu ve Paketlerin Yüklenmesi

mod_wsgi’nin doğru virtualenv’i kullandığından emin olun. WSGIDaemonProcess içindeki python-home parametresini iki kez kontrol edin. Eğer projeniz çalışmıyorsa ve Python bağımlılıkları eksik diyorsa, virtualenv’i etkinleştirip pip freeze komutunu çalıştırarak yüklü paketleri kontrol edin.

WSGIDaemonProcess ve WSGIProcessGroup Hataları

Bu parametrelerin Apache yapılandırmanızda doğru ayarlandığından ve birbiriyle eşleştiğinden emin olun. Yanlış yapılandırma, Apache’nin WSGI uygulamasını başlatamamasına neden olabilir.

ALLOWED_HOSTS Hatası

Eğer tarayıcınızda “Disallowed Host” hatası görüyorsanız, settings.py dosyasındaki ALLOWED_HOSTS listesine sunucunuzun IP adresini veya alan adınızı eklediğinizden emin olun.

collectstatic Unutulması

Django admin paneli veya kendi uygulamanızın statik dosyaları yüklenmiyorsa, python manage.py collectstatic komutunu çalıştırmayı unutmuş olabilirsiniz. Ayrıca, Apache yapılandırmanızdaki Alias /static yolunun doğru olduğundan ve STATIC_ROOT ile eşleştiğinden emin olun.

Sonuç

Bu makalede, Django uygulamanızı Debian VPS üzerinde Apache ve mod_wsgi ile bir virtualenv ortamında nasıl çalıştıracağınızı detaylı bir şekilde inceledik. Sistem kurulumundan Apache ve Django yapılandırmasına, veritabanı entegrasyonundan güvenlik ipuçlarına kadar her adımı ele aldık. Bu kombinasyon, Django projeleriniz için sağlam, güvenli ve yüksek performanslı bir üretim ortamı sunar. Adımları dikkatlice takip ederek ve kendi proje detaylarınıza göre ayarlamalar yaparak Django uygulamanızı başarıyla dağıtabilirsiniz.

Unutmayın ki her projenin kendine özgü gereksinimleri olabilir. Bu rehber genel bir çerçeve sunar ve spesifik ihtiyaçlarınıza göre ek yapılandırmalar veya optimizasyonlar yapmanız gerekebilir. Özellikle güvenlik ve performans konularında sürekli güncel kalmak ve en iyi pratikleri uygulamak önemlidir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version