Xairro.com

Login
Schliessen

Willkommen im Xairroversum! Ein kostenloser Account bei uns bietet dir mehrere Vorteile. Welche das genau sind, kannst du in der Tour erfahren. Viel Spaß!

Login

Register

Django mit lighttpd über FastCGI

Einen Apache dazu zu bringen, mit Django Websiten auszugeben ist nicht schwer. Dafür gibt es z.B. mod_python und mod_wsgi. Aber was ist, wenn man nun lighttpd als Webserver nutzen will? Es gibt hier zwei Möglichkeiten: CGI und FastCGI, wobei man FastCGI bevorzugen sollte.

lighttpd Module

Es werden ein paar Module benötigt, um Django ordentlich einrichten zu können. Auf jeden Fall nötig sind mod_fastcgi (um FastCGI nutzen zu können) und mod_rewrite (um alles auf den FastCGI Server zu rewriten). Optional kann man noch mod_alias installieren, um einen Alias für das Media-Verzeichnis ist.

lighttpd konfigurieren

Wir werden Django später so einrichten, dass es über einen UNIX-Socket erreichbar sein wird. Alternativ wäre auch TCP möglich, wodurch auch Loadbalancing über mehrere Server möglich wäre. Wer das braucht, fragt bitte die Django Dokumentation.

Die lighttpd Konfiguration sieht dann etwa so aus:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$HTTP["host"] == "www.example.com" {
	fastcgi.server = (
		"/django.fcgi" => (
			"main" => (
				"socket" => "/home/www/site.sock",
				"check-local" => "disable",
			)
		),
	)
	alias.url = (
		"/media/" => "/home/www/site/media/",
	)
	url.rewrite-once = (
		"^(/media.*)$" => "$1",
		"^/favicon\.ico$" => "/media/favicon.ico",
		"^(/.*)$" => "/django.fcgi$1",
	)
}

In diesem Beispiel ist Django dann unter /django.fcgi zu erreichen. Der Socket befindet sich in diesem Beispiel unter /home/www/site.sock. Wie man bei alias.url sehen kann, wird ein Alias für /media/ erstellt. Bei den Rewrite-Regeln werden alle URLs, die mit /media/ beginnen auf den Alias rewritet, /favicon.ico wird auch /media/favicon.ico rewritet und alles andere auf Django, welches als FastCGI läuft.

Django konfigurieren

Gut, doch was bringt das einem jetzt? Wenn man lighttpd jetzt restartet, gibt es nur einen 500 - Internal Server Error. Das ist auch völlig normal, da der FastCGI-Server ja noch garnicht läuft. Hier wird jetzt erklärt, wie man diesen zum Laufen bringt.

FastCGI-Server starten

Man kann den FastCGI-Server ganz einfach mit manage.py starten. Alternativ geht natürlich auch django-admin.py mit einer gesetzten DJANGO_SETTINGS_MODULE Umgebungsvariable. Wir bei Xairro starten den Server zum Beispiel so:

1
./manage.py runfcgi method=threaded daemonize=true socket=/home/user/site.sock pidfile=/home/www/site.pid

Natürlich sind die Pfade bei uns anders und das ganze läuft über django-admin.py. Wer diesen Befehl jetzt ausführt, sollte auch seine Seite sehen, wenn er sie im Browser aufruft.

Achtung: Der FastCGI-Server läuft mit den Rechten des Benutzers, der ihn gestartet hat! Wenn man diesen Befehl also als root ausführt, hat die gesamte Seite root-Rechte!

Aber ein kleines Problem gibt es jetzt noch: Was passiert, wenn man den Server zum Bespiel rebootet? Genau, der Server läuft nicht mehr und es gibt wieder den gleichen Fehler.

init.d Script

Hinweis: Dieser Abschnitt wurde nur unter Debian (etch) getestet, sollte aber genau so oder ähnlich auch mit anderen Linux-Distributionen funktionieren.

init.d Scripte befinden sich unter /etc/init.d/. Dort sollte man unter anderem Scripte für lighttpd und andere Server, wie zum Beispiel Postfix finden. Diese Scripte sind ganz normale Shell-Scripte und lassen sich ganz leicht erstellen. Ein Script für Django könnte zum beispiel so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/sh

# START configuration
USER=www-data

MANAGE_FILE=/home/www/site/manage.py
SOCKET=/home/www/site.sock
PIDFILE=/home/www/site.pid
# END configuration

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

DESC="FastCGI servers"
NAME=$0
SCRIPTNAME=/etc/init.d/$NAME

d_start()

{
	su $USER -c "$MANAGE_FILE runfcgi method=threaded daemonize=true socket=$SOCKET pidfile=$PIDFILE"
}

d_stop() {

	kill `cat $PIDFILE`
}

ACTION="$1"
case "$ACTION" in
    start)

        echo -n "Starting $DESC: $NAME"
        d_start
        echo "."
        ;;

    stop)
        echo -n "Stopping $DESC: $NAME"

        d_stop
        echo "."
        ;;

    restart|force-reload)
        echo -n "Restarting $DESC: $NAME"
        d_stop
        sleep 1
        d_start
        echo "."

        ;;

    *)
        echo "Usage: $NAME {start|stop|restart|force-reload}" >&2
        exit 3
        ;;
esac

exit 0

Wenn man das Script jetzt als /etc/init.d/django abgespeichert hat, sollte folgender Befehl dafür sorgen, dass das Ganze beim Booten ausgeführt wird:

1
update-rc.d /etc/init.d/django defaults

0 comments

Sorry but there are no comments for this entry. What about writing the first one?

Post comment

Zum Kommentieren musst du angemeldet sein.

About the author

Julian programmierte seit etwa mitte 2006 in PHP. Ende 2007 entschied er sich aber für Python, was er heute meistens im Web zusammen mit Django nutzt.

Tags

alias alternativ befehl beispiel daemonize dann dass desc diesem diesen django exit fastcgi favicon fcgi gibt home ico init konfigurieren lighttpd läuft manage media module möglich name pidfile rewritet seite server site sock socket start starten true url usr www