Wie man Python-Neulingen, die einen gemeinsam genutzten IIS-Server ausführen, die Django / Python-Installation erklärt [geschlossen]

9

Aus Gründen, die außerhalb meiner Kontrolle liegen, wird unsere Website von einem Hosting-Anbieter gehostet, der IIS für seine Server verwendet. Sie bieten derzeit PHP und ASP sowie Python und Perl über CGI-Skripte an.

Ich möchte unsere Website neu gestalten, neu schreiben und von PHP zu einem Python / Django-Setup wechseln. Der Hosting-Anbieter ist offen für Vorschläge, aber es ist klar: "Wir wissen nicht wirklich, was Python ist oder wie es funktioniert, aber wenn Sie es uns erklären können, werden wir versuchen, Sie mit allem einzurichten, was Sie brauchen." .

Ich weiß vielleicht, wie man Django in einer gemeinsam genutzten Hosting-Umgebung auf apache / mod_python einrichtet, aber ich habe keine Ahnung, wie es auf IIS eingerichtet wird und schon gar nicht, wie es für eine gemeinsam genutzte Hosting-Umgebung eingerichtet wird. Ich habe ein bisschen gegoogelt, aber die meisten Ressourcen, die ich finde, gehen davon aus, dass der Systemadministrator 1) Python / Django kennt und 2) dediziertes IIS-Hosting für seine Site verwendet.

Könnte jemand erklären, wie ich meinem Hosting-Anbieter den Vorgang erklären kann, oder mir Hinweise auf gute, detaillierte Ressourcen geben, die ich an meinen Hosting-Anbieter weiterleiten kann? Denken Sie daran, dass die Leute, die das Hosting betreiben, möglicherweise "alles" über IIS wissen, aber keine Ahnung haben, wie sie mit Python umgehen sollen.

Epcylon
quelle

Antworten:

8

Wenn Sie mit IIS nicht weiterkommen, verwenden Sie PyISAPIe anstelle von CGI, wenn Sie können. Anweisungen und Links für PyISAPIe finden Sie unten. Ihr Webhost weiß viel mehr über ISAPI-Erweiterungen, wenn er IIS verwaltet, als über Python, und er muss nicht viel über Python mit PyISAPIe wissen.

Eine viel bessere Möglichkeit, dies zu tun, ist die Verwendung von PyISAPIe, einer ISAPI-Erweiterung . PyISAPIe ist viel, viel schneller als CGI auf IIS7. Dies funktioniert ähnlich wie mod_python unter Apache. Auf der PyISAPIe-Projekthomepage finden Sie Anweisungen zum Einrichten von Django mit WSGI über PyISAPIe. Dies bringt Ihre Leistung auf eine angemessene Geschwindigkeit für eine öffentliche / stark frequentierte Website.

Das Einrichten von Django in einem IIS + Python über eine CGI-Umgebung wird für jede Produktionsanwendung schrecklich langsam sein. Sie sollten dies niemals für eine Website verwenden, auf der Sie voraussichtlich mehr als eine Handvoll Anfragen pro Minute bearbeiten. Es schränkt Sie auch stark ein, was Sie im Caching-Framework von Django im Speicher zwischenspeichern können, da der Prozess der Django-App bei jeder neuen Anforderung neu gestartet wird.

Auf einem vernünftigen Webserver wie Apache, lighttpd usw. mit mod_python bleibt der Python-Interpreter, der den Django-Prozess ausführt, im Speicher und wird mit jedem neuen Apache-Worker-Thread initialisiert, der im Laufe der Zeit viele Anforderungen verarbeitet. Dies bedeutet, dass Python + Django nicht für jede neue Anforderung beendet und neu gestartet wird. In einem FastCGI-Setup erstellt der Webserver (z. B. Apache oder lighttpd) einen Socket (UNIX-Domäne oder TCP), über den er über das FastCGI-Protokoll mit einer FastCGI-Anwendung (Ihrer Django-Webanwendung) kommuniziert. Das Gleiche gilt für HTTP-Proxy-Setups (sie sprechen HTTP anstelle von FastCGI). In einer CGI-Umgebung wird der Python-Interpreter aufgerufen, der die Django-Anwendung für jede Anforderung vollständig neu ausführt, sodass die Anwendung den Status nicht über alle Anforderungen im Speicher hinweg beibehalten und nur in einer Datenbank ordnungsgemäß zwischenspeichern kann.

Genug geschimpft, wenn Sie IIS + CGI + Django verwenden müssen, gehen Sie wie folgt vor , um diese schreckliche schreckliche Sache zu erreichen: Verwenden Sie den folgenden Code , um Ihr eigenes CGI-Skript zu erstellen, das Ihre Django-App ausführt (es übersetzt zwischen CGI und WSGI). Sie müssen das Skript ein wenig bearbeiten, damit es auf Ihre Django-App und Ihren Code verweist. Dies ist das CGI-Skript, an das Sie Anforderungen übergeben müssen. Als nächstes müssen Sie alle Anforderungen an Ihr CGI-Skript weiterleiten / umschreiben ...

Unter IIS6 benötigen Sie ein mod_rewrite-Äquivalent wie IISRewrite, das meiner Meinung nach nicht kostenlos und Closed Source ist. Unter IIS7 hat Microsoft schließlich ein Modul zum Umschreiben von URLs hinzugefügt. Die Dokumentation dazu finden Sie hier . Anweisungen zum Erstellen von Umschreiberegeln in IIS7 finden Sie hier . Sie möchten alles an die Ziel-Basis-URL weiterleiten, die von Ihrem CGI-Skript verarbeitet werden soll.

user6281
quelle
Da das Hosting gemeinsam genutzt wird, ist das Hauptproblem, wie der Hosting-Anbieter PyISAPIe so konfigurieren würde, dass es meinen Anforderungen und auch den unterschiedlichen Anforderungen seiner anderen Kunden entspricht. Ich konnte die Anweisungen zum Einrichten von Django mit WSGI auf der Homepage nicht finden ... Wenn alles andere fehlschlägt, verwende ich einfach den CGI-Ansatz. Mit weniger als 400 Anfragen pro Woche können wir meiner Meinung nach mit der CGI-Lösung leben, bis wir uns entscheiden, das Hosting zu wechseln.
Epcylon
1

So richten Sie Python unter FastCGI unter IIS ein

Hier erfahren Sie, wie Sie Python unter FastCGI IIS 7+ einrichten, um den Weg für ein anständiges DJango-Setup zu ebnen

... und in der Lage sein, einen Debugger in den Prozess einzubinden, damit Sie Ihren Python-Code schrittweise durchgehen können

In diesem Beispiel wird die IIS-Verwaltungskonsole nicht verwendet, sondern der Inhalt der resultierenden Konfigurationsdateien aufgelistet

Schritt 1

Installieren Sie Python + einen guten Debugger (in diesem Beispiel wird WingIDE verwendet, für das ich ein hervorragendes Tool gefunden habe). In diesem Beispiel wird der Ordner c: \ python27 vorausgesetzt

Schritt 2

Erstellen Sie einen Webordner, z. B. unter localhost c: \ inetpub \ wwwroot \ mypythonfolder, und fügen Sie die folgende Datei web.config ein:

Beachten Sie die | Pipe-Zeichen in der scriptProcessor-Direktive. Dies wird von IIS verwendet, um das Skript einer fastCgi-Anwendung zuzuordnen (Schritt 3). Es sollte Zeichen für Zeichen mit den Einstellungen für Vollpfad + Pipe-Zeichen + Argumente aus Schritt 3 unten übereinstimmen.

Schritt 3

Fügen Sie in der Datei applicationHost.config im Ordner c: \ windows \ system32 \ inetsrc \ config Folgendes in den Abschnitt ein:

    <fastCgi>
        <application fullPath="c:\python27\python.exe" arguments="c:\python27\lib\mylib\myfcgi.py" monitorChangesTo="C:\Python27\Lib\r4a\r4afcgi.py" stderrMode="ReturnStdErrIn500" maxInstances="4" idleTimeout="300" activityTimeout="300" requestTimeout="90" instanceMaxRequests="200" protocol="NamedPipe" queueLength="1000" flushNamedPipe="true" rapidFailsPerMinute="10" />
    </fastCgi>

Schritt 4

Geben Sie in c: \ python27 \ lib \ mylib \ myfcgi.py den folgenden Code ein:

import wingdbstub

importiere os, io, sys ret = "Umgebung: \ r \ n" für param in os.environ.keys (): ret = ret + "% s =% s \ r \ n"% (param, os.environ [ param]) ret = ret + "\ r \ nArgs:" für arg in sys.argv: ret = ret + arg handle = io.open ("c: \ temp \ myfcgi.log", 'wb') handle.write (ret) handle.close ()

Schritt 5

Stellen Sie sicher, dass IUSR zum Schreiben in Ihren Ordner c: \ temp berechtigt ist

Schritt 6

Legen Sie wingdbstub.py und wingdebugpw in Ihrem Ordner c: \ python27 \ lib \ mylib \ ab. Dies ermöglicht das Debuggen in Wingide. Diese Dateien werden mit Ihrer Flügelinstallation geliefert. Hinweis: Wenn Python Ihren Code auch in wingstub.pyc kompilieren muss, benötigt IUSR Schreibrechte für diesen Ordner, da der Python-Prozess unter diesem Konto von IIS gestartet wird

Schritt 6

Öffnen Sie wingdb und setzen Sie einen Haltepunkt in der Zeile 'import os, io, sys'

Schritt 7

Klicken Sie in Ihrem Browser auf http: // localhost / mypythonfolder

Wenn alles korrekt funktioniert, sollte Wingide jetzt ausgelöst werden, um den laufenden Code an Ihrem Haltepunkt anzuzeigen. Wenn nicht: - Es liegt entweder ein Firewall-Problem vor. Der Python-Prozess kommuniziert mit der WingIDE-Schnittstelle über eine TCP-Verbindung - oder es gibt ein Problem mit der Sicherheit innerhalb von Wingide. Es benötigt die richtige Version der Wingdebugpw-Datei, die im Grunde ein Passwort oder Token enthält, das den Zugriff auf Ihre Wingide-Installation überprüft. Wenn dies nicht der Fall wäre, könnte jeder mit TCP-Zugriff auf Ihren PC gegen Ihren Code debuggen.

Schritt 8

Stellen Sie sicher, dass in c: \ temp die Protokolldatei erstellt wurde. Dies sollte auch funktionieren, wenn Sie Schritt 7 nicht ausführen können

Schritt 9

Beachten Sie, dass diese Seite den Debugger auslöst, aber keine Seite an den Webbrowser zurückgibt. Einige Hintergrundinformationen: Der Webserver kommuniziert fastcgi über sogenannte "Datensätze". Dies bedeutet, dass jede einzelne Benutzeranforderung in Ihre Anwendung eingeht und in mehreren separaten "Datensätzen" verpackt ist. Jeder Datensatz ist eine Datenstruktur, die den Beginn einer Anforderung, den Querystring, die Post-Variablen usw. angibt. Das Auspacken dieser Datensätze in eine einzelne Anforderung ist etwas umständlich und folgt der Fastcgi-Spezifikation von http: //www.fastcgi .com / devkit / doc / fcgi-spec.html # S1

Als Inhalt von c: \ python27 \ lib \ mylib \ myfcgi.py habe ich gerade eine von helicontech bereitgestellte Kopie von zoofcgi.py abgelegt. Diese Python-Datei kann diese Datensätze dekodieren und eine Seite bereitstellen. Das Debuggen ist sehr interessant. Beachten Sie auch, dass helicontech optional eine DLL bereitstellt, die sich zwischen IIS und und zoofcgi.py befindet. Diese DLL ist jedoch nicht unbedingt erforderlich. Ich glaube, es implementiert eine leicht verbesserte und generische Version der von msft bereitgestellten Fastcgi-Implementierung. Wenn Sie jedoch ihre DLL verwenden und Ihren Code schrittweise durchlaufen möchten, wird der Prozess ziemlich schnell beendet und IIS / die DLL beendet Ihren Python-Prozess, wenn festgestellt wird, dass innerhalb von ein oder zwei Sekunden keine Antwort zurückkommt.

Das ist es. Grundsätzlich erfolgt die Kommunikation zwischen IIS und Ihrem Python-Code über Named Pipes. Sie sollten es mit TCP-Sockets einrichten können, aber ich konnte nicht herausfinden, welcher Port verwendet wird (ich glaube, der Standard sollte in den Port umgewandelt werden, der dann ausgewählt () werden kann, aber das habe ich nicht angegeben jeder Versuch)

Robert van Geel
quelle
0

Ich habe dies nicht mit Python versucht, aber es hat als CGI mit Perl großartig funktioniert. Die Produkte von ActiveState lassen sich nahtlos in IIS integrieren. Ich hatte großen Erfolg mit ActivePerl. Sie haben auch ActivePython, das (wahrscheinlich) auch dort den Trick machen würde. Dann würden Sie einfach Django herunterladen und installieren .

EDIT: Ok, also kratzen Sie an der scheinbaren Integration mit IIS ... JEDOCH, hier ist ein Artikel über die Integration in IIS . Sie können Iron Python auch als Ihre Distribution für eine Windows-Box betrachten.

Für den Anbieter würde ich bezweifeln, dass er mehr wissen muss als es sich um eine Webentwicklungsplattform wie ASP / ASP.NET handelt und dass Python die Sprache ist, die für die Entwicklung verwendet wird.

Was die oben erwähnte Installation betrifft, werde ich das versuchen und sehen, wie es abschneidet. Ich werde Notizen dazu posten, wenn es funktioniert!

Squillman
quelle