Infrastruktur Update – Server, Django, FastCGI, Nginx

Nicht nur die Code-Basis von kuerbis.org hat einige Updates erhalten, sondern auch die zugrunde liegende Infrastruktur.

OpenVZ

Da wäre zunächst der neue Server, dessen Speicherausbau die Nutzung der Virtualisierungslösung OpenVZ erlaubt. Da die Erfahrungen mit OpenVZ bislang sehr gut waren, insbesondere in Bezug auf Performance, habe ich mich dafür und somit gegen Xen oder ähnliches entschieden. Davon abgesehen ist die Einrichtung einfach und flexibel, insofern nach dem KISS Prinzip genau richtig.

Django und Nginx

Die Django-Anwendung läuft als FastCGI, Hinweise zur grundsätzlichen Einrichtung finden sich in der Dokumentation. Als Web-Server wird jedoch nicht Lighttpd, sondern Nginx verwendet. Nginx (“engine-x”) ist ein hochperformanter, flexibler und ressourcenschonender Web-Server und Reverse-Proxy. Ursprünglich vom russischen Programmierer Igor Sysoev für eine Suchmaschine entwickelt, findet Nginx inzwischen Verbreitung bei einigen großen Web-Sites.

Basis von kuerbis.org ist ein Ubuntu Server 8.04 Linux System. Obwohl bereits neuere Versionen von Nginx vorliegen, wurde das von Ubuntu bereit gestellte Paket verwendet. Die Installation mittels sudo apt-get install nginx ist in wenigen Sekunden erledigt. Django wurde dagegen direkt aus dem Versionsverwaltungssystem bezogen. Die Verzeichnisstruktur im Einzelnen:

/vol/django/
           /django-trunk -- Django aus dem Subversion-Repository
           /kdosite/     -- kuerbis.org Site 
                   /templates/
                   /static/
                   settings.py
                   urls.py
                   ...                    
           /kuerbisorg/  -- kuerbis.org Applikationsverzeichnis

 

Die FastCGI-Prozesse werden mit dem Start-Stop-Skript /etc/init.d/kdosite verwaltet:

 

#! /bin/sh

### BEGIN INIT INFO
# Provides: nginx
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the kuerbis.org fastcgi django application
# Description: starts kuerbis.org fastcgi application using start-stop-daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=kdosite
DESC=kdosite

set -e
SITEDIR="/vol/django/kdosite"

case "$1" in
start)
echo -n "Starting $DESC: "
if [ -f "${SITEDIR}/kuerbis.pid" ] ; then
rm -f "${SITEDIR}/kuerbis.pid"
fi
start-stop-daemon --start \
--chuid www-data:www-data --oknodo \
--exec /vol/django/kdosite/manage.py \
-- runfcgi method=prefork \
pidfile=/vol/django/kdosite/kuerbis.pid \
socket=/vol/django/kdosite/kuerbis.sock

echo "$NAME."
;;
stop)
echo -n "Stopping $DESC: "
start-stop-daemon --stop --quiet \
--pidfile "/vol/django/kdosite/kuerbis.pid"
# --exec $DAEMON
echo "$NAME."
;;
restart|force-reload)
echo -n "Restarting $DESC: "
start-stop-daemon --stop --quiet \
--pidfile "/vol/django/kdosite/kuerbis.pid"
sleep 1
start-stop-daemon --start \
--chuid www-data:www-data --oknodo \
--exec /vol/django/kdosite/manage.py \
-- runfcgi method=prefork \
pidfile=/vol/django/kdosite/kuerbis.pid \
socket=/vol/django/kdosite/kuerbis.sock
echo "$NAME."
;;
*)
N=/etc/init.d/$NAME
echo "Usage: $N {start|stop|restart|force-reload}" >&2
exit 1
;;
esac

 

Das Skript hat zwar noch Schwächen, aber da ich Shellskripts bislang weitestgehend vermieden habe, bitte ich, darüber hinweg zu sehen. 😉

Für Nginx ist bereits das Start-Stop-Skript /etc/init.d/nginx eingerichtet worden. Die Konfiguration besteht zunächst aus der Datei /etc/init.d/nginx.conf. Zur Einrichtung der verschiedenen Sites dienen die Unterverzeichnisse /etc/init.d/sites-available und /etc/init.d/sites-enabled/. Dabei nehmen die einzelnen Konfigurationsdateien in sites-available Platz. Anschließend wird auf jene Dateien ein symbolicher Link innerhalb sites-enabled gesetzt. Beim Start bindet Nginx alle in sites-enabled verfügbaren Konfigurationen ein. Dieser Mechanismus wird auch bei anderen Programmen verwendet, z.B. Apache.

Die Parameter für die Anbindung des Django FastCGI Daemons befinden sich in der Datei /etc/nginx/sites-available/kuerbis.org:

server {
    listen 80;
    server_name www.kuerbis.org kuerbis.org;

    location ~ ^/static/ {
        root /vol/django/kdosite;
        expires 14d;
    }

    location ~ ^/media/ {
        root /vol/django/django-trunk/django/contrib/admin;
        expires 14d;
    }

    location / {
        # host and port to fastcgi server
        fastcgi_pass unix:/vol/django/kdosite/kuerbis.sock;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_pass_header Authorization;
        fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
        fastcgi_param REMOTE_ADDR $remote_addr;
        fastcgi_param REMOTE_PORT $remote_port;
        fastcgi_param SERVER_ADDR $server_addr;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_NAME $server_name;
        fastcgi_intercept_errors off;
    }

    access_log /vol/www/www.kuerbis.org/logs/nginx.access_log;
    error_log /vol/www/www.kuerbis.org/logs/nginx.error_log;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/nginx-default;
    }

}

 

Wie man erkennen kann, ist die Einrichtung übersichtlich und nahezu selbsterklärend. Requests auf /static/ und /media/ werden direkt von Nginx verarbeitet, darin befinden sich statische Dateien, etwa CSS-, JavaScript-Dateien oder Bilder. Alle anderen Requests werden an den FastCGI-Socket weiter geleitet. Einige vom Apache bekannten und in der Anwendung genutzten Variablen werden inklusive der korrespondierenden Inhalte ebenfalls übergeben.

Nginx bietet natürlich noch viel mehr, die Dokumentation im Community-Wiki wird stetig erweitert. Ein genauerer Blick auf diese russische Alternative zu Apache sowie Lighttpd lohnt sich bestimmt!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Tags: