Update 21.10.2016:

Microsoft hat mittlerweile das Python Paket wfastcgi bereitgestellt. Das Paket kann einfach via Pip installiert werden und man spart sich den Umweg über den Microsoft Webplattform Installer. Die weitere Konfiguration des IIS ist beim Python Paket gut dokumentiert.

Python/Django Windows Hosting mit IIS 7+

Wir sind Perfektionisten mit Ablieferungsterminen und setzen deshalb für unsere Web Applikationen vorwiegend den Python/Django Web Framework ein.

Seit Microsoft auf seiner Cloud Plattform Azure ein Python Entwicklungszentrum eingerichtet hat, ist die Windows Plattform für das Hosting von Web Applikationen mit dem Python/Django Framework interessant geworden. Auch die hauseigene Entwicklungsumgebung Visual Studio ist nun für Python ausgebaut worden.

Diese Entwicklungen haben uns dazu veranlasst, ein Windows Deployment von Python/Django Web Applikationen auf dem Microsoft Webserver IIS (Internet Information Services) zu testen und eine Schritt-für-Schritt Anleitung zu erstellen.

Als Basis haben wir einen Dinosaurier hervorgeholt: Windows Server 2008 mit IIS 7. Wir wollten wissen, inwieweit die Neuerungen auch abwärtskompatibel auf der Windows Plattform sind.

Software Installation

Neben dem ISS sind Python und Django die Minimalanforderungen für die Softwareinstallation. Im Normalfall kommt bei einer umfangreicheren Web Applikation noch die Datenbank der Wahl hinzu (z. B. PostgreSQL, MySQL). Wir spielen hier der Einfachheit halber aber nur die Installation eines “Hello World!”-Projektes durch.

1. Python/Django

Mit dem Windows Installer wird Python 2.7.9 installiert. Über die Kommandozeile wird anschliessend Django installiert:

C:\inetpub> pip install django

Dannach wird in einem beliebigen Verzeichnis (z. B. C:\inetpub) ein neues Django Projekt erzeugt:

C:\inetpub> django-admin.py startnewprojekt helloworld

Das Skript legt im Verzeichnis C:\inetpub\helloworld das neue Projekt an. Es ist “good practice” aus Sicherheitsgründen das Applikationsverzeichnis nicht mit dem Webserver zu “serven”. Hierzu aber mehr bei den IIS Webseiten Einstellungen.

Das Projekt kann jetzt testweise über den Django Entwicklungsserver von der Kommandozeile gestartet werden:

C:\inetpub\helloworld\>python manage.py runserver

2. IIS

Der ISS sollte über die entsprechende Serverrolle im Servermanager aktiviert werden. Das CGI Modul muss aktiviert werden.

Für den Betrieb einer Django Web Applikation muss zusätzlich noch ein Gateway für FastCGI - PythonWSGI installiert werden. Dies kann entweder über den Microsoft Webplattform Installer (WPI) oder einen gesonderten Installer passieren. Auf älteren Systemen muss der WPI nachinstalliert werden. Nach dem Start des WPI führt eine Suche nach WFastCGI schnell zum Ziel. Diese Option muss dann auch installiert werden.

Der WPI installiert dann die Datei wfastcgi.py im Python Standardverzeichnis C:\Python27\Scripts\. Hierfür ist wichtig dass vorher Python installiert wurde, da der WPI ansonsten eine Fehlermeldung schmeisst.

Die Datei wfastcgi.py wird nun aus dem Verzeichnis C:\Python27\Scripts\ in das Verzeichnis C:\inetpub\helloworld kopiert.

Im IIS Server Manager wird nun eine neue Webseite “Helloworld” angelegt. Als Verzeichnis wird hierfür C:\inetpub\wwwroot verwendet:

Diese Webseite anklicken und die Handlerzuordnungen öffnen. Dann eine  Modulzuordnung hinzufügen. Folgende Einstellungen vornehmen:

  • Anforderungspfad: *
  • Modul: FastCgiModule
  • Ausführbare Datei: C:\Python27\python.exe|C:\inetpub\helloworld\wfastcgi.py
  • Name: Helloworld
  • Einschränkungen: die Checkbox “Handler nur bei folgender Zuordnung aufrufen” ist nicht ausgewählt (verursacht ansonsten Probleme beim URL Routing/Mapping)

Sind alle Einstellungen vorgenommen auf OK drücken. Es erscheint ein Dialog in dem gefragt wird, ob ein FastCGI Applikationseintrag erstellt werden soll. Dieser Eintrag sollte nun angelegt werden.

Alle eingehenden URL Requests (*) werden nun von der Django Web Applikation verarbeitet (internes URL Routing).

Nun das Hauptverzeichnis des IIS im Server Manager auswählen und das FastCGI Einstellungs Icon anklicken. In der nun erscheinenden Liste sollte der gerade erstellte Eintrag angezeigt werden.

Diesen anklicken so dass sich der Einstellungsdialog öffnet. Dort müssen die Umgebungsvariablen für unsere Webapplikation wie folgt gesetzt werden:

  • DJANGO_SETTINGS_MODULE: helloworld.settings

  • PYTHONPATH:C:\inetpub\helloworld

  • WSGI_HANDLER: django.core.wsgi.get_wsgi_application()

Wichtig ist hier der neue WSGI Handler. Ab Django 1.7 funktioniert der alte Handler django.core.handlers.wsgi.WSGIHandler() für den IIS nicht mehr. Siehe hierzu auch den Artikel auf der pytools Webseite.

Start der Webseite

Die Helloworld Webseite kann nun gestartet werden. Standardmässig bedient der Server Webseiten auf Port 80. Sollten mehrere Webseiten installiert sein beschwert sich der IIS, dass diese auf dem selben Port laufen.

Für die Helloworld Seite kann auch ein Port 8000 (wie beim Django Development Server) eingestellt werden. Die Webseite ist dann auf dem Server unter http:\\127.0.0.1:8000 zu erreichen.

Static und Media Files

Für das Helloworld Projekt sind diese Einstellungen zunächst ausreichend. Bei produktiven Django Projekten müssen jedoch zusätzlich statische- und Media-Dateien vom Webserver ausgeliefert werden.

Da momentan alle URL Requests von der Django Webapplikation verarbeitet werden, also auch die Request für Dateien im \static und \media Verzeichnis, benötigen wir nun extra Einstellungen für diese Verzeichnisse. Wir legen diese Verzeichnisse als virtuelle Verzeichnisse in der Helloworld Webseite im IIS Manager an.

Wichtig ist das wir dem IIS anschliessend für diese Verzeichnissen im Dateisystem ( C:\inetpub\helloworld\helloworld\static, C:\inetpub\helloworld\helloworld\media) die richtigen Zugriffsrechte einräumen. Der IIS braucht für \static Lesezugriff, für \media Schreib- und Lesezugriff.

ISS “vererbt” standardmässig beim Erstellen dieser virtuellen Verzeichnisse alle Handler Einstellungen des übergeordneten Verzeichnisses/Webseite. Das heisst wir müssen nach dem Anlegen dieser Verzeichnisse auf diese klicken und die Handler Einstellungen öffnen. Dort muss der Helloworld-Handler für alle eingehenden Requests (*) gelöscht werden, da er verhindert, dass Requests für das \static und \media Verzeichnis verarbeitet werden.

Mt diesen Einstellungen kann der Webserver nun produktiv betrieben werden. Skaliermöglichkeiten bestehen im FastCGI-Einstellungsdialog des IIS Server Managers. Dort lässt sich über folgende Parameter der Resourcenverbrauch steuern:

  • Max instances
  • Instance MaxRequests

Interessant ist auch Monitor changes to file. Bei Änderungen an den Dateien der Web Applikation wird diese automatisch neu geladen.

Kommentare, Ergänzungen und Kritik ist herzlich willkommen. Nutzen Sie dafür bitte unser Kontaktformular.

Autor: Max Pfeiffer - Alp Phone GmbH