mod_wsgi Kullanarak Uygulamaları Ubuntu 12.04 Üzerinde Sunma
Giriş
Web uygulamalarının sunulması, modern internet altyapısının temel taşlarından biridir. Özellikle Python tabanlı web çerçeveleri (Django, Flask, Pyramid vb.) söz konusu olduğunda, bu uygulamaları güvenli, performanslı ve ölçeklenebilir bir şekilde sunmak için özel araçlara ihtiyaç duyulur. Bu araçlardan biri de Apache HTTP Sunucusu için bir modül olan mod_wsgi‘dir. Bu makale, mod_wsgi‘nin ne olduğunu, neden önemli olduğunu ve özellikle Ubuntu 12.04 işletim sistemi üzerinde Python uygulamalarını nasıl sunacağınızı adım adım detaylı bir şekilde açıklayacaktır. Ubuntu 12.04 eski bir sürüm olmasına rağmen, burada anlatılan temel prensipler ve adımlar, mod_wsgi‘nin işleyişini anlamak için hala geçerlidir ve daha yeni sistemlere adaptasyonu kolaylaştıracaktır.
mod_wsgi, Python uygulamaları ile web sunucusu (Apache) arasında bir köprü görevi görür. Web Sunucusu Gateway Arayüzü (WSGI) standardını uygulayarak, Python uygulamalarının farklı web sunucuları tarafından kolayca barındırılmasını sağlar. Bu, geliştiricilerin uygulama mantığına odaklanmasına olanak tanırken, sunucunun HTTP isteklerini işleme, statik dosyaları sunma ve güvenlik gibi görevleri yerine getirmesine izin verir. mod_wsgi, C dilinde yazıldığı için yüksek performans sunar ve Apache’nin güçlü özelliklerinden (sanal ana bilgisayarlar, SSL, kimlik doğrulama vb.) doğrudan yararlanabilir.
Bu makalede, bir Ubuntu 12.04 sunucusunu hazırlamaktan başlayarak, Apache ve mod_wsgi kurulumunu, basit bir Python WSGI uygulamasının oluşturulmasını, Apache sanal ana bilgisayar yapılandırmasını, sanal ortam kullanımını, güvenlik hususlarını ve yaygın sorun giderme tekniklerini ele alacağız. Amacımız, okuyucunun kendi Python web uygulamalarını Ubuntu 12.04 üzerinde başarıyla dağıtabilmesi için kapsamlı bir rehber sunmaktır.
Ön Koşullar
mod_wsgi ile bir Python uygulamasını başarıyla sunabilmek için bazı temel ön koşulların karşılanması gerekmektedir. Bu bölüm, gerekli yazılımları ve temel sistem bilgilerini özetlemektedir:
* Ubuntu 12.04 Sunucusu: Bu makale özellikle Ubuntu 12.04 üzerine odaklanmıştır. Bir sanal makine veya fiziksel bir sunucu olabilir.
* SSH Erişimi: Sunucuya komut satırı üzerinden erişim için SSH bağlantısı gereklidir.
* Kök veya Sudo Yetkileri: Yazılım yüklemek ve sistem yapılandırmasını değiştirmek için kök (root) kullanıcı veya sudo yetkilerine sahip bir kullanıcı hesabı gereklidir.
* Temel Linux Komut Satırı Bilgisi: Dosya sistemi navigasyonu, paket yönetimi (apt-get), dosya düzenleme (vi, nano) gibi temel komutlara aşinalık beklenmektedir.
* Apache2: Apache HTTP Sunucusu’nun kurulu olması gerekmektedir. Eğer kurulu değilse, sonraki adımlarda nasıl kurulacağı açıklanacaktır.
* Python: Ubuntu 12.04 varsayılan olarak Python 2.7 ile gelir. mod_wsgi kurulumu ve uygulama geliştirme için Python’ın yüklü olması şarttır.
* İnternet Bağlantısı: Paketleri indirmek ve güncellemek için sunucunun internete bağlı olması gerekmektedir.
Bu ön koşullar sağlandıktan sonra, mod_wsgi kurulumu ve Python uygulamasının dağıtımına geçebiliriz.
Apache2 Kurulumu
mod_wsgi bir Apache modülü olduğundan, öncelikle Apache HTTP Sunucusu’nun sisteminizde kurulu ve çalışır durumda olması gerekir. Ubuntu 12.04 üzerinde Apache2 kurulumu oldukça basittir.
Sistem Paket Listesini Güncelleme
Herhangi bir yeni yazılım yüklemeden önce, sistemin paket listesini güncellemek iyi bir uygulamadır. Bu, en son paket bilgilerini almanızı ve olası bağımlılık sorunlarını önlemenizi sağlar:
sudo apt-get update
Apache2 Kurulumu
Paket listesi güncellendikten sonra, Apache2’yi aşağıdaki komutla kurabilirsiniz:
sudo apt-get install apache2
Kurulum sırasında onay istenirse Y tuşuna basıp Enter’a basarak devam edin.
Apache Servisini Kontrol Etme
Kurulum tamamlandıktan sonra Apache servisinin otomatik olarak başlaması beklenir. Servisin durumunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
sudo service apache2 status
Eğer servis çalışmıyorsa, aşağıdaki komutla başlatabilirsiniz:
sudo service apache2 start
Kurulumu Doğrulama
Apache’nin doğru bir şekilde kurulup kurulmadığını ve erişilebilir olup olmadığını doğrulamak için, sunucunuzun IP adresini veya alan adını bir web tarayıcısına yazarak kontrol edebilirsiniz. Varsayılan olarak, Apache’nin “It works!” (Çalışıyor!) mesajını içeren bir sayfa göstermesi gerekir. Eğer bu sayfayı görüyorsanız, Apache başarıyla kurulmuş demektir.
Python ve Gerekli Paketlerin Kurulumu
Ubuntu 12.04, varsayılan olarak Python 2.7 ile gelir. mod_wsgi ve Python uygulamalarınız için ek paketlere ihtiyacınız olabilir. Özellikle python-dev paketi, mod_wsgi gibi C uzantılarını derlemek için gereklidir. Ayrıca, Python paketlerini yönetmek için pip ve bağımlılık izolasyonu için virtualenv kullanmak şiddetle tavsiye edilir.
Python Geliştirme Başlıklarını Kurma
mod_wsgi‘yi kaynaktan derlemeyi planlıyorsanız veya bazı Python paketlerinin C uzantılarını derlemesi gerekiyorsa, python-dev paketine ihtiyacınız olacaktır:
sudo apt-get install python-dev
pip Kurulumu
pip, Python paketlerini yüklemek ve yönetmek için standart bir araçtır. Ubuntu 12.04’te pip‘i aşağıdaki gibi kurabilirsiniz:
sudo apt-get install python-pip
pip kurulduktan sonra, kendisini en son sürüme güncellemek iyi bir fikirdir:
sudo pip install --upgrade pip
virtualenv Kurulumu
virtualenv, Python projeleri için izole edilmiş Python ortamları oluşturmaya yarar. Bu, farklı projeler için farklı bağımlılık setlerini yönetmenizi sağlar ve sistem genelindeki Python kurulumunuzu temiz tutar.
sudo pip install virtualenv
virtualenv kurulumuyla birlikte, Python geliştirme ortamınız için temel araçlara sahip olursunuz. Uygulamanızın bağımlılıklarını izole etmek için her zaman virtualenv kullanmanız önerilir.
mod_wsgi Kurulumu
mod_wsgi‘yi Ubuntu 12.04 üzerine kurmanın iki ana yolu vardır: APT deposundan yüklemek veya kaynaktan derlemek. APT deposundan yüklemek genellikle daha kolay ve hızlıdır, ancak kaynaktan derlemek daha fazla kontrol ve en son özelliklere erişim sağlar.
APT Deposundan Kurulum (Önerilen)
Bu yöntem, çoğu kullanıcı için en kolay ve en hızlı yoldur. Ubuntu’nun resmi depolarındaki mod_wsgi paketini kullanır.
sudo apt-get install libapache2-mod-wsgi
Bu komut, mod_wsgi modülünü kuracak ve Apache yapılandırmasına gerekli dosyaları ekleyecektir.
Kaynaktan Kurulum (Daha Gelişmiş)
Eğer mod_wsgi‘nin belirli bir sürümünü kullanmanız gerekiyorsa veya en son özelliklere erişmek istiyorsanız, kaynaktan derleme yolunu tercih edebilirsiniz. Bu yöntem, Apache’nin geliştirme başlıklarına (apxs) ihtiyaç duyar.
Apache Geliştirme Başlıklarını Kurma
sudo apt-get install apache2-prefork-dev
mod_wsgi Kaynağını İndirme
mod_wsgi‘nin en son kararlı sürümünü resmi web sitesinden veya GitHub deposundan indirebilirsiniz. Örneğin, wget ile indirme:
cd /tmp
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.9.0.tar.gz # Veya en son sürüm
tar -xvf 4.9.0.tar.gz
cd mod_wsgi-4.9.0 # İndirdiğiniz klasör adı
mod_wsgi’yi Derleme ve Kurma
Derleme işlemi configure, make ve make install adımlarını içerir:
./configure --with-apxs=/usr/bin/apxs
make
sudo make install
--with-apxs parametresi, Apache’nin apxs aracının yolunu belirtir. Bu araç, modülün Apache tarafından doğru bir şekilde kurulmasını sağlar.
mod_wsgi Modülünü Etkinleştirme
Her iki kurulum yönteminden sonra, mod_wsgi modülünü Apache’de etkinleştirmeniz gerekir.
sudo a2enmod wsgi
Bu komut, /etc/apache2/mods-available/wsgi.load dosyasını /etc/apache2/mods-enabled/ dizinine sembolik olarak bağlar ve modülün Apache tarafından yüklenmesini sağlar.
Apache’yi Yeniden Başlatma
Modül etkinleştirildikten sonra, Apache’nin yeni yapılandırmayı yüklemesi için yeniden başlatılması gerekir:
sudo service apache2 restart
Apache’nin sorunsuz bir şekilde yeniden başladığından emin olun. Herhangi bir hata mesajı alırsanız, /var/log/apache2/error.log dosyasını kontrol edin.
Örnek Bir WSGI Uygulaması Oluşturma
Şimdi mod_wsgi‘nin çalışıp çalışmadığını test etmek için basit bir Python WSGI uygulaması oluşturalım. Bu örnekte, Flask çerçevesini kullanacağız, ancak temel WSGI arayüzünü anlatan saf bir WSGI uygulaması da oluşturulabilir.
Proje Dizini Oluşturma
Uygulamamız için bir dizin oluşturalım. Genellikle web uygulamaları /var/www/ altında barındırılır.
sudo mkdir -p /var/www/my_app
sudo chown -R www-data:www-data /var/www/my_app
sudo chmod -R 755 /var/www/my_app
cd /var/www/my_app
Burada, my_app dizinini oluşturduk ve Apache’nin varsayılan kullanıcısı olan www-data‘ya sahiplik verdik. Bu, Apache’nin uygulama dosyalarına erişebilmesi için önemlidir.
Sanal Ortam Oluşturma ve Flask Kurulumu
Uygulama bağımlılıklarını izole etmek için bir sanal ortam oluşturalım ve Flask’ı bu ortama kuralım.
virtualenv env
source env/bin/activate
pip install Flask
deactivate
Bu adımlar, env adında bir sanal ortam oluşturur, onu etkinleştirir, Flask’ı kurar ve ardından sanal ortamdan çıkar.
Uygulama Dosyası (application.py)
Şimdi Flask uygulamamızı içeren application.py dosyasını oluşturalım:
sudo nano /var/www/my_app/application.py
İçeriği aşağıdaki gibi olsun:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Merhaba, Ubuntu 12.04 ve mod_wsgi!'
@app.route('/test')
def test_page():
return 'Bu bir test sayfasıdır.'
if __name__ == '__main__':
app.run(debug=True)
WSGI Giriş Noktası (wsgi.py)
mod_wsgi‘nin uygulamanızı nasıl yükleyeceğini belirten bir WSGI giriş noktası dosyasına ihtiyacımız var. Bu dosya genellikle wsgi.py olarak adlandırılır.
sudo nano /var/www/my_app/wsgi.py
İçeriği aşağıdaki gibi olsun:
import sys
import os
Sanal ortamın Python yolunu ekle
Ubuntu 12.04'te bu adım çok önemlidir.
env/bin/python içindeki site-packages'ı bulmak için.
sys.path.insert(0, '/var/www/my_app/env/lib/python2.7/site-packages') # Python 2.7 için
Eğer sanal ortam Python 3 kullanıyorsa:
sys.path.insert(0, '/var/www/my_app/env/lib/python3.x/site-packages')
Uygulama dizinini PATH'e ekle
sys.path.insert(0, os.path.dirname(__file__))
Flask uygulamasını yükle
from application import app as application
Önemli Not: sys.path.insert(0, '/var/www/my_app/env/lib/python2.7/site-packages') satırı, mod_wsgi‘nin sanal ortamınızdaki Flask gibi paketleri bulabilmesi için kritik öneme sahiptir. Ubuntu 12.04’teki Python 2.7 için yolun doğru olduğundan emin olun.
Apache Sanal Host Konfigürasyonu
Uygulamamızı Apache üzerinden sunmak için bir sanal ana bilgisayar (Virtual Host) yapılandırması oluşturmamız gerekiyor. Bu yapılandırma, Apache’ye gelen istekleri hangi uygulamaya yönlendireceğini ve mod_wsgi‘nin uygulamanızı nasıl çalıştıracağını söyleyecektir.
Yeni Bir Sanal Host Dosyası Oluşturma
Apache sanal ana bilgisayar yapılandırma dosyaları genellikle /etc/apache2/sites-available/ dizininde bulunur. Uygulamamız için yeni bir dosya oluşturalım:
sudo nano /etc/apache2/sites-available/my_app.conf
İçeriği aşağıdaki gibi olsun:
ServerAdmin webmaster@localhost
ServerName example.com # Kendi alan adınızı veya IP adresinizi buraya yazın
# ServerAlias www.example.com # İsteğe bağlı olarak diğer alan adlarını ekleyebilirsiniz
# WSGIDaemonProcess: Python uygulamanız için bir daemon süreci oluşturur.
# Bu, uygulamanızın Apache süreçlerinden izole çalışmasını sağlar.
# user=www-data group=www-data: Uygulamanın çalışacağı kullanıcı ve grup.
# processes=2 threads=15: İki Python süreci ve her süreçte 15 iş parçacığı.
# python-path: Sanal ortamın site-packages dizinini ve uygulama kök dizinini belirtir.
# Ubuntu 12.04 ve Python 2.7 için yolun doğru olduğundan emin olun.
# python-home: Sanal ortamın kök dizinini belirtir. mod_wsgi'nin Python'ı bulması için önemlidir.
WSGIDaemonProcess my_app user=www-data group=www-data \
processes=2 threads=15 \
python-home=/var/www/my_app/env \
python-path=/var/www/my_app:/var/www/my_app/env/lib/python2.7/site-packages \
display-name=%{GROUP}
# WSGIProcessGroup: Bu sanal host için hangi daemon sürecinin kullanılacağını belirtir.
WSGIProcessGroup my_app
# WSGIScriptAlias: Gelen istekleri WSGI uygulamasına yönlendirir.
# İlk parametre URL yolu, ikinci parametre wsgi.py dosyasının yolu.
WSGIScriptAlias / /var/www/my_app/wsgi.py
# bloğu: WSGI betiğinin bulunduğu dizin için erişim izinlerini tanımlar.
# Require all granted: Tüm isteklere izin verir.
WSGIProcessGroup my_app
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
# Apache 2.4 ve üzeri için: Require all granted
# Hata ve Erişim günlükleri
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Açıklamalar:
* ServerName example.com: Bu, uygulamanıza erişmek için kullanacağınız alan adıdır. Kendi alan adınızı veya sunucunuzun IP adresini yazmalısınız.
* WSGIDaemonProcess: Bu direktif, uygulamanızın çalışacağı bir daemon süreci tanımlar.
* my_app: Daemon sürecine verdiğimiz isimdir.
* user=www-data group=www-data: Uygulamanın www-data kullanıcısı ve grubu altında çalışmasını sağlar. Bu, güvenlik ve dosya izinleri için önemlidir.
* processes=2 threads=15: İki Python sürecinin ve her süreçte 15 iş parçacığının oluşturulmasını belirtir. Bu, eşzamanlı istekleri işlemeye yardımcı olur. Uygulamanızın ihtiyaçlarına göre ayarlayabilirsiniz.
* python-home=/var/www/my_app/env: Sanal ortamınızın kök dizinini belirtir. Bu, mod_wsgi‘nin doğru Python yorumlayıcısını bulması için kritik öneme sahiptir.
* python-path=/var/www/my_app:/var/www/my_app/env/lib/python2.7/site-packages: Python’ın uygulama modüllerini ve sanal ortamdaki paketleri nerede arayacağını belirtir. Uygulama dizinini (/var/www/my_app) ve sanal ortamın site-packages dizinini eklediğinizden emin olun. Python 2.7 için yolun python2.7 içerdiğine dikkat edin.
* display-name=%{GROUP}: Süreç listesinde daha açıklayıcı bir isim görünmesini sağlar.
* WSGIProcessGroup my_app: Bu sanal ana bilgisayarın, yukarıda tanımlanan my_app daemon sürecini kullanacağını belirtir.
* WSGIScriptAlias / /var/www/my_app/wsgi.py: Gelen tüm istekleri (/) /var/www/my_app/wsgi.py dosyasındaki WSGI uygulamasına yönlendirir.
* : Bu blok, wsgi.py dosyasının bulunduğu dizin için özel yapılandırma sağlar. WSGIProcessGroup ve WSGIApplicationGroup direktiflerinin burada tekrar edilmesi önemlidir. Order deny,allow ve Allow from all Apache 2.2 tarzı izinlerdir.
Sanal Hostu Etkinleştirme
Yeni yapılandırma dosyasını etkinleştirmek için Apache’nin a2ensite komutunu kullanın:
sudo a2ensite my_app.conf
Varsayılan Apache sayfasını devre dışı bırakmak iyi bir uygulamadır, böylece uygulamanız tek erişilebilir site olur:
sudo a2dissite default
Apache Yapılandırmasını Test Etme ve Yeniden Başlatma
Değişiklikleri uygulamadan önce Apache yapılandırmasının sözdizimini test etmek her zaman iyi bir fikirdir:
sudo apache2ctl configtest
Eğer Syntax OK mesajını alırsanız, Apache’yi güvenle yeniden başlatabilirsiniz:
sudo service apache2 restart
Şimdi, tarayıcınızdan http://example.com (veya sunucunuzun IP adresi) adresine giderek uygulamanızın çalışıp çalışmadığını kontrol edebilirsiniz. “Merhaba, Ubuntu 12.04 ve mod_wsgi!” mesajını görmelisiniz.
Sanal Ortam Kullanımı
Daha önce de belirtildiği gibi, sanal ortamlar Python projeleri için bağımlılık izolasyonu sağlamak açısından kritik öneme sahiptir. mod_wsgi ile sanal ortamları doğru bir şekilde kullanmak, uygulama dağıtımında sık karşılaşılan bir konudur.
Neden Sanal Ortamlar?
* Bağımlılık Çakışmalarını Önler: Farklı projeler aynı paketin farklı sürümlerine ihtiyaç duyabilir. Sanal ortamlar, her projenin kendi bağımlılık setine sahip olmasını sağlar.
* Sistem Genelindeki Python’ı Temiz Tutar: pip install komutları sistem genelindeki Python kurulumunuzu kirletmez.
* Taşınabilirlik: Bir sanal ortamdaki bağımlılıkları pip freeze > requirements.txt ile kolayca listeleyebilir ve başka bir ortamda pip install -r requirements.txt ile yeniden kurabilirsiniz.
* Güvenlik: Uygulamanızın sadece ihtiyaç duyduğu paketlere erişmesini sağlar.
mod_wsgi ile Sanal Ortam Entegrasyonu
Yukarıdaki Apache yapılandırmasında WSGIDaemonProcess direktifi içinde python-home ve python-path parametrelerini kullanarak sanal ortamı mod_wsgi‘ye tanıttık. Bu parametreler, mod_wsgi‘nin uygulamanız için doğru Python yorumlayıcısını ve paketlerini bulmasını sağlar.
* python-home=/var/www/my_app/env: Bu parametre, mod_wsgi‘ye sanal ortamınızın kök dizininin nerede olduğunu söyler. mod_wsgi, bu dizin içindeki Python yorumlayıcısını ve ilgili kütüphaneleri kullanmaya çalışır.
* python-path=/var/www/my_app:/var/www/my_app/env/lib/python2.7/site-packages: Bu parametre, Python’ın modülleri arayacağı ek dizinleri belirtir. Uygulamanızın kendi kodunu (application.py) bulması için /var/www/my_app ve sanal ortamınızdaki yüklü paketleri bulması için /var/www/my_app/env/lib/python2.7/site-packages dizinini ekledik.
Bu yapılandırma, mod_wsgi‘nin sanal ortamınızı tam olarak anlamasını ve uygulamanızı doğru bağımlılıklarla çalıştırmasını sağlar. Herhangi bir Python paketini uygulamanıza kurduğunuzda, bunu sanal ortam etkinleştirilmişken yapmanız ve ardından Apache’yi yeniden başlatmanız (veya wsgi.py dosyasını touch ile güncellemeniz) önemlidir.
Güvenlik ve İzinler
Web uygulamalarını sunarken güvenlik her zaman öncelikli olmalıdır. mod_wsgi ile çalışırken dikkat etmeniz gereken bazı temel güvenlik ve izin hususları şunlardır:
Dosya ve Dizin İzinleri
Apache’nin www-data kullanıcısı, uygulama dosyalarınıza ve wsgi.py betiğine okuma ve yürütme iznine sahip olmalıdır. Eğer uygulamanız dosya yükleme, log yazma gibi işlemler yapıyorsa, ilgili dizinlere www-data kullanıcısının yazma izni de olmalıdır.
* Uygulama Kök Dizini (/var/www/my_app): www-data kullanıcısının bu dizine ve içindeki tüm dosyalara okuma ve yürütme izni olmalıdır.
sudo chown -R www-data:www-data /var/www/my_app
sudo chmod -R 755 /var/www/my_app
* Hassas Dosyalar: Veritabanı yapılandırma dosyaları, API anahtarları gibi hassas bilgileri içeren dosyaların izinlerini kısıtlayın. Bu dosyalara sadece uygulamanın çalışacağı kullanıcının (genellikle www-data) erişimi olmalı ve diğer kullanıcılar için okuma izni olmamalıdır. Örneğin, 640 veya 600 izinleri kullanılabilir.
WSGIDaemonProcess user/group Parametreleri
WSGIDaemonProcess direktifindeki user ve group parametreleri, uygulamanızın hangi kullanıcı ve grup kimliği altında çalışacağını belirler.
WSGIDaemonProcess my_app user=www-data group=www-data \
...
Varsayılan olarak www-data kullanıcısı Apache’nin kendisi tarafından kullanılır. Eğer birden fazla uygulamanız varsa veya daha sıkı bir izolasyon istiyorsanız, her uygulama için ayrı bir sistem kullanıcısı ve grubu oluşturup WSGIDaemonProcess içinde belirtebilirsiniz. Bu, bir uygulamanın güvenliğinin ihlal edilmesi durumunda diğer uygulamaların veya sistemin zarar görmesini sınırlayabilir.
# Örnek: my_app_user adında bir kullanıcı ve grup oluşturma
sudo adduser --system --no-create-home my_app_user
sudo chown -R my_app_user:my_app_user /var/www/my_app
Daha sonra Apache yapılandırmasında user=my_app_user group=my_app_user olarak ayarlayabilirsiniz.
Dizin Listelemesini Devre Dışı Bırakma
Apache’nin varsayılan yapılandırması, bir dizin içinde index.html veya index.php gibi bir dosya bulunmadığında dizin içeriğini listeleyebilir. Bu bir güvenlik açığıdır. Uygulama dizininiz için bunu devre dışı bırakmak için Options -Indexes kullanın:
Options -Indexes # Dizin listelemeyi devre dışı bırakır
...
SSL/TLS Kullanımı
Hassas verileri (parolalar, kişisel bilgiler vb.) işleyen her web uygulaması için SSL/TLS kullanmak zorunludur. mod_wsgi doğrudan SSL ile ilgili değildir, ancak Apache SSL modülünü (mod_ssl) etkinleştirerek ve bir SSL sertifikası yapılandırarak uygulamanızı HTTPS üzerinden güvenli bir şekilde sunabilirsiniz.
sudo a2enmod ssl
sudo service apache2 restart
Daha sonra sanal host yapılandırmanıza bloğunu ekleyerek SSL sertifika yollarını belirtmeniz gerekir.
Hata Ayıklama ve Sorun Giderme
Uygulamaları dağıtırken sorunlarla karşılaşmak kaçınılmazdır. mod_wsgi ile ilgili yaygın sorunları gidermek için bazı teknikler ve kontrol noktaları şunlardır:
Apache Hata Günlükleri
Apache hata günlükleri, sorun gidermenin ilk ve en önemli adımıdır. Genellikle /var/log/apache2/error.log adresinde bulunurlar. Bu günlükleri düzenli olarak kontrol edin:
sudo tail -f /var/log/apache2/error.log
Burada Python izleme yığınları, mod_wsgi‘den gelen hata mesajları veya Apache’nin kendi yapılandırma hataları gibi değerli bilgiler bulabilirsiniz.
Apache Yapılandırmasını Test Etme
Herhangi bir Apache yapılandırma değişikliğinden sonra apache2ctl configtest komutunu çalıştırmak, sözdizimi hatalarını yakalamanıza yardımcı olur:
sudo apache2ctl configtest
Syntax OK dışında bir çıktı alırsanız, hatayı düzeltmeden Apache’yi yeniden başlatmayın.
mod_wsgi Modülünün Durumunu Kontrol Etme
mod_wsgi modülünün Apache tarafından doğru bir şekilde yüklendiğinden emin olun:
sudo apache2ctl -M | grep wsgi
Eğer wsgi_module (shared) çıktısını görmüyorsanız, sudo a2enmod wsgi komutunu çalıştırdığınızdan ve Apache’yi yeniden başlattığınızdan emin olun.
Dosya ve Dizin İzinleri
İzin sorunları, mod_wsgi ile en yaygın karşılaşılan sorunlardan biridir. Apache’nin çalıştırdığı www-data kullanıcısının (WSGIDaemonProcess içinde belirtilen kullanıcı) uygulama dosyalarınıza, wsgi.py betiğine ve sanal ortam dizinlerine okuma ve yürütme izni olduğundan emin olun. Eğer uygulamanız dosya yazıyorsa (log, yükleme vb.), ilgili dizinlere yazma izni de olmalıdır.
* ls -l /var/www/my_app/wsgi.py
* ls -ld /var/www/my_app/env
* ls -l /var/www/my_app/env/bin/python
Komutları ile izinleri kontrol edin.
Python Yolu Sorunları (python-path, python-home)
WSGIDaemonProcess içindeki python-path ve python-home parametrelerinin doğru ayarlandığından emin olun. Özellikle sanal ortam kullanılıyorsa, site-packages dizininin doğru yolunu belirtmek önemlidir. Yanlış yollar ImportError hatalarına yol açar.
* Sanal ortamın Python sürümünü kontrol edin (örn. Python 2.7).
* site-packages dizininin tam yolunu doğrulayın (örn. /var/www/my_app/env/lib/python2.7/site-packages).
* wsgi.py içinde sys.path‘e eklediğiniz yolların doğru olduğundan emin olun.
Uygulama Kodu Hataları
Eğer mod_wsgi yapılandırmanız doğru görünüyorsa ve hala uygulama çalışmıyorsa, sorun uygulamanızın kendi kodunda olabilir. wsgi.py dosyanızın uygulamanızı doğru bir şekilde içe aktardığından emin olun.
* wsgi.py dosyanızı doğrudan Python yorumlayıcısı ile çalıştırmayı deneyin (ancak bu, bir web sunucusu ortamını tam olarak taklit etmez).
* Uygulamanızın yerel bir geliştirme sunucusunda (örn. python application.py ile Flask’ın geliştirme sunucusu) çalışıp çalışmadığını kontrol edin.
WSGI Uygulamasını Yeniden Yükleme
Uygulama kodunuzda bir değişiklik yaptığınızda, mod_wsgi‘nin bu değişiklikleri algılaması için genellikle Apache’yi yeniden başlatmanız gerekir. Ancak, Apache’yi tamamen yeniden başlatmak yerine, wsgi.py dosyasının mtime (değiştirme zamanı) özelliğini güncelleyerek mod_wsgi‘ye uygulamanızı yeniden yüklemesini söyleyebilirsiniz:
sudo touch /var/www/my_app/wsgi.py
Bu, Apache süreçlerini kesintiye uğratmadan uygulamanızın yeni kodunu yüklemesini sağlar.
Gelişmiş Konfigürasyonlar
mod_wsgi, uygulamalarınızın performansını ve kararlılığını artırmak için çeşitli gelişmiş yapılandırma seçenekleri sunar.
WSGIApplicationGroup
Varsayılan olarak, bir WSGIDaemonProcess içindeki tüm WSGI uygulamaları aynı Python yorumlayıcı alanında çalışır. Bu, paylaşılan bellek ve genel değişkenler açısından verimli olabilir, ancak bir uygulamanın çökmesi durumunda diğerlerini de etkileyebilir. WSGIApplicationGroup direktifi, farklı uygulamaların aynı daemon süreci içinde bile farklı yorumlayıcı alanlarında çalışmasını sağlar.
WSGIProcessGroup my_app
WSGIApplicationGroup %{GLOBAL} # Her isteği global uygulama grubuna atar
# Veya spesifik bir isim: WSGIApplicationGroup my_app_group
%{GLOBAL} en yaygın kullanımdır. Eğer uygulamanızın çok sayıda bellekte yerleşik modülü varsa veya izole edilmesi gerekiyorsa, özel bir grup adı kullanmak faydalı olabilir.
WSGIRestrictStdout ve WSGIRestrictSignal
* WSGIRestrictStdout On: Python uygulamanızın sys.stdout ve sys.stderr‘e yazmasını kısıtlar. Bu, uygulamanızın doğrudan Apache hata günlüklerine yazmasını engeller ve log yönetimini daha düzenli hale getirir. Genellikle WSGIDaemonProcess içinde ErrorLog veya Log parametresi ile özel bir günlük dosyası belirtmek daha iyidir.
* WSGIRestrictSignal On: Python uygulamanızın sinyal işleyicilerini değiştirmesini kısıtlar. Bu, Apache’nin kendi sinyal yönetimiyle çakışmaları önler.
WSGIChunkedRequest
Büyük dosya yüklemeleri gerektiren uygulamalar için WSGIChunkedRequest direktifi önemlidir. Bu, istemciden gelen parçalı kodlanmış (chunked-encoded) isteklerin doğru bir şekilde işlenmesini sağlar.
WSGIChunkedRequest On
Process Yönetimi ve Performans
WSGIDaemonProcess içindeki processes ve threads parametreleri, uygulamanızın performansını doğrudan etkiler.
* processes: Çalışacak ayrı Python yorumlayıcısı süreçlerinin sayısıdır. Her süreç bağımsızdır ve kendi belleğine sahiptir. CPU yoğun uygulamalar için CPU çekirdeği sayısına yakın bir değer önerilir.
* threads: Her Python sürecinin içindeki iş parçacığı sayısıdır. G/Ç yoğun (veritabanı sorguları, ağ istekleri) uygulamalar için daha yüksek bir iş parçacığı sayısı faydalı olabilir. Python’ın GIL (Global Interpreter Lock) nedeniyle, tek bir Python sürecinde aynı anda sadece bir iş parçacığı Python kodunu yürütebilir, ancak G/Ç işlemleri sırasında diğer iş parçacıkları bekleyebilir.
Diğer performans parametreleri:
* maximum-requests=1000: Bir daemon sürecinin belirli sayıda istekten sonra otomatik olarak yeniden başlatılmasını sağlar. Bu, bellek sızıntılarını veya uzun süre çalışan süreçlerde biriken sorunları önlemek için faydalıdır.
* graceful-timeout=15: Bir daemon süreci kapatılırken veya yeniden başlatılırken, mevcut isteklerin tamamlanması için ne kadar bekleneceğini belirtir.
Bu parametreleri uygulamanızın kaynak tüketimine ve trafik yüküne göre ayarlamanız gerekecektir.
Sonuç
Bu makalede, mod_wsgi kullanarak Python web uygulamalarını Ubuntu 12.04 üzerinde nasıl sunacağınızı adım adım inceledik. mod_wsgi, Apache HTTP Sunucusu ile Python uygulamaları arasında güçlü, performanslı ve güvenilir bir köprü görevi görerek, web uygulamalarınızın üretim ortamlarında sorunsuz bir şekilde çalışmasını sağlar.
Ubuntu 12.04’ün eski bir sürüm olmasına rağmen, burada ele alınan kurulum, yapılandırma ve sorun giderme prensipleri, mod_wsgi‘nin temel işleyişini anlamak için hala geçerlidir. Daha yeni Ubuntu sürümlerinde veya farklı Linux dağıtımlarında süreçler benzer olmakla birlikte, paket isimleri veya Python varsayılan sürümleri gibi küçük farklılıklar olabilir. Ancak, WSGIDaemonProcess ve WSGIScriptAlias gibi anahtar direktifler ve sanal ortam kullanımı gibi en iyi uygulamalar değişmez kalır.
Özetle, başarılı bir mod_wsgi dağıtımı için dikkat etmeniz gerekenler:
* Doğru Kurulum: Apache ve mod_wsgi‘nin sisteminize doğru bir şekilde kurulduğundan emin olun.
* Sanal Ortamlar: Python bağımlılıklarını izole etmek için her zaman sanal ortamlar kullanın.
* Doğru Yapılandırma: Apache sanal ana bilgisayarınızdaki WSGIDaemonProcess, python-home, python-path ve WSGIScriptAlias direktiflerini uygulamanızın gereksinimlerine göre doğru bir şekilde ayarlayın.
* Güvenlik ve İzinler: Uygulama dosyalarınız ve dizinleriniz için doğru dosya izinlerini ayarlayın ve WSGIDaemonProcess için uygun user/group ayarlarını kullanın. SSL/TLS’i ihmal etmeyin.
* Hata Ayıklama: Sorunlarla karşılaştığınızda Apache hata günlüklerini (/var/log/apache2/error.log) dikkatlice inceleyin ve apache2ctl configtest gibi araçları kullanın.
mod_wsgi‘nin sunduğu esneklik ve performans sayesinde, Python tabanlı web uygulamalarınızı güvenle dağıtabilir ve yönetebilirsiniz. Bu rehberin, bu süreçte size yol göstermesini umuyoruz.