django-hosting.de

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.

View Plain  |  Index  |  Home

Showing: head, History: head [62] [55] [29] [28] [18] [2]