Django mit mod_wsgi betreiben
Note
Diese Lösung unterscheidet sich kaum vom Hosting mit mod_fcgid, deshalb kann es nicht schaden, sich auch ApacheModFcgid anzuschauen.
Vorweg der Aufbauf des Dateisystems, für den diese Konfiguration gedacht ist, Änderungen sollten kein Problem sein, wenn man das Konzept verstanden hat.
/srv/http/80/
/www.example.com/
/htdocs/
/lib/
Unterhalb von /srv/http/80/ gibt es für jede Domain (FQDN) ein Verzeichnis. (www.example.com ist z.B. ein Symlink auf example.com im selben Verzeichnis) In jedem Domain-Ordner gibt es mindestens die Ordner htdocs (öffentlicht über den Apache zugänglich) und lib (nicht per Webserver erreichbar). In lib können eine eigene Django Version und die Applikation selbst gelegt werden. Der Ordner wird quasi eine Erweiterung des Python site_packages Ordners.
Unter htdocs liegen mindestens eine .htaccess Datei, eine app.wsgi Datei - zu beiden später mehr - und admin-media und site-media Ordner werden per symbolischem Link eingebunden.
Hier die mod_wsgi Apache Config: (Achtung: in den Directory Direktiven muss noch etwas aufgeräumt werden ...)
NameVirtualHost *:80
<VirtualHost *:80>
ServerName server.example.com
ServerAlias *
ServerAdmin webmaster@example.com
DocumentRoot "/srv/http/80"
VirtualDocumentRoot "/srv/http/80/%0/htdocs"
VirtualScriptAlias "/srv/http/80/%0/cgi-bin"
WSGIDaemonProcess mysitepool user=mysite group=www-data processes=5 threads=1
SetEnv PROCESS_GROUP default
WSGIProcessGroup %{ENV:PROCESS_GROUP}
WSGIReloadMechanism Interpreter
<Directory />
Options FollowSymLinks
AllowOverride None
Options +ExecCGI
</Directory>
<Directory /srv/http/80/>
Options Indexes FollowSymLinks MultiViews +ExecCGI
AllowOverride All
Order allow,deny
allow from all
</Directory>
#Don't allow access to any .svn entries in the path
#Only needed because the site_media directory may
#be under version control
<Directory ~ "\.svn">
Order allow,deny
Deny from all
</Directory>
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
ServerSignature Off
</VirtualHost>
Dann in jedem VirtualDocumentRoot eine .htaccess Datei nach folgendem Beispiel:
SetEnv PROCESS_GROUP mysitepool
AddHandler wsgi-script .wsgi
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /app.wsgi/$1 [QSA,L]
Und die app.wsgi im selben Verzeichnis zum starten der WSGI Anwendung:
#!/usr/bin/python
import sys, os
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../lib/'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
In diesem Beispiel heißt das django projekt mysite, deshalb 'mysite.settings' in der app.wsgi. Eine eigene Django Version für die Anwendung liegt relativ zum DocumentRoot in ../lib/django/, deswegen wird ../lib/ zum PATH hinzugefügt.
Durch die Zeile WSGIReloadMechanism Interpreter in der httpd.conf ist es Möglich die WSGI Applikation (Django) ohne Neustart des Webservern zu reloaden und zwar durch ein einfaches touch app.wsgi.
Note
Die Option Interpreter für den WSGIReloadMechanism gibt es nur in mod_wsgi 1.3; in Version 2.0 gibt es die Mechanismen Module und Process. Hier würde Process dem Verhalten von Interpreter am besten entsprechen.
Damit Admin-Media Daten und Site-Media (MEDIA_ROOT)Daten erreichbar sind werden zwei Symlinks angelegt:
ln -s /srv/http/80/www.example.com/lib/django/contrib/admin/media/ /srv/http/80/www.example.com/htdocs/admin_media
ln -s /srv/http/80/www.example.com/lib/mysite/site_media/ /srv/http/80/www.example.com/htdocs/site_media
Für dieses Beispiel sind in der Django settings.py folgende Einstellungen zu tätigen:
ADMIN_MEDIA_PREFIX = '/admin_media/'
MEDIA_ROOT = '/srv/http/80/www.example.com/lib/mysite/site_media/'
MEDIA_URL = 'http://www.example.com/site_media/'
Noch schöner ist es jedoch das MEDIA_ROOT relativ zur Applikation anzugeben, dadurch entstehen beim Ãndern des Verzeichnis-Layouts auf dem Server weniger Probleme, so kann es gemacht werden (in der settings.py):
import os
MEDIA_ROOT = os.path.join(os.path.dirname(__file__),'site_media')
Zum Thema mod_wsgi unbedingt auch die offizielle Dokumentation unter http://www.modwsgi.org anschauen.



