Konfigurieren von Python-Web-Apps für IIS

Wenn Sie die Internetinformationsdienste (IIS) als Webserver auf einem Windows-Computer verwenden (einschließlich virtuelle Windows-Maschinen auf Azure), müssen Sie die Python-Webanwendung konfigurieren, damit IIS den Python-Code ordnungsgemäß verarbeiten kann. Die Konfiguration erfolgt über Einstellungen in der Datei web.config für die Python-Webanwendung. In diesem Artikel wird beschrieben, wie Sie die erforderlichen Einstellungen vornehmen.

Voraussetzungen

  • Python auf Windows installiert. Um eine Web-App auszuführen, installieren Sie zunächst Ihre gewünschte Version von Python direkt auf dem Windows-Hostcomputer, wie unter Installieren von Python-Interpretern beschrieben.

    • Geben Sie den Standort des Dolmetschers python.exe an. Zur Vereinfachung können Sie diesen Speicherort Ihrer PATH-Umgebungsvariablen hinzufügen.
  • Erforderliche Pakete installiert. Bei einem dedizierten Host können Sie die globale Python-Umgebung verwenden, um Ihre Anwendung auszuführen, anstatt eine virtuelle Umgebung. Dementsprechend können Sie alle Anforderungen für Ihre Anwendung in die globale Umgebung installieren, indem Sie den Befehl pip install -r requirements.txt ausführen.

Festlegen, dass die „web.config“-Datei auf den Python-Interpreter verweist

Die web.config-Datei für Ihre Python-Anwendung weist den IIS-Webserver (Version 7 oder höher) unter Windows an, wie er Python-Anfragen über HttpPlatformHandler (empfohlen) oder FastCGI behandeln soll. Visual Studio 2015 und frühere Versionen nehmen diese Anpassungen automatisch vor. Für Visual Studio 2017 und höher müssen Sie die Datei web.config manuell ändern.

Wenn Ihr Projekt noch keine web.config-Datei enthält, können Sie eine hinzufügen, indem Sie mit der rechten Maustaste auf das Projektverzeichnis klicken, Add > New Item wählen und nach web.config suchen oder eine leere web.config-XML-Datei erstellen.

Konfigurieren des HttpPlatformHandlers

Das HTTP-Plattformmodul übergibt die Socketverbindungen direkt an einen eigenständigen Python-Prozess. Mit diesem Pass-Through können Sie jeden beliebigen Webserver ausführen, aber es erfordert ein Startskript, das einen lokalen Webserver ausführt. Dieser Ansatz wird in der Regel mit einem Python-Web-Framework wie Flask oder Django umgesetzt. Sie geben das Skript im Element <httpPlatform> in der Datei web.config an. Das Attribut processPath verweist auf den Python-Interpreter der Website-Erweiterung. Das Attribut arguments verweist auf Ihr Startskript, das einen lokalen Webserver ausführt, in diesem Fall runserver.py, und alle Argumente, die Sie angeben möchten:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="c:\python36-32\python.exe"
                  arguments="c:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="c:\home\LogFiles\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

In diesem Beispiel enthält die Umgebungsvariable HTTP_PLATFORM_PORT den Port, an dem Ihr lokaler Server auf Verbindungen von localhost. Dieses Beispiel zeigt auch, wie man eine weitere Umgebungsvariable erstellt, SERVER_PORT. Sie können nach Bedarf Umgebungsvariablen erstellen und zuweisen.

Konfigurieren des FastCGI-Handlers

FastCGI ist eine Schnittstelle, die auf der Anforderungsebene funktioniert. IIS empfängt eingehende Verbindungen und leitet jede Anforderung an eine WSGI-Anwendung an einen oder mehrere persistente Python-Prozesse weiter.

Hinweis

Es wird empfohlen, HttpPlatformHandler zum Konfigurieren Ihrer Apps zu verwenden, da das WFastCGI-Projekt nicht mehr verwaltet wird.

Um FastCGI zu verwenden, installieren und konfigurieren Sie zunächst das wfastcgi-Paket wie in pypi.org/project/wfastcgi/ beschrieben.

Ändern Sie als nächstes die Datei web.config Ihrer Anwendung, um die vollständigen Pfade zur ausführbaren Datei python.exe und zur Datei wfastcgi.py in den Schlüssel PythonHandler aufzunehmen. Die folgenden Schritte gehen davon aus, dass Python im Ordner c:\python36-32 und der Anwendungscode im Ordner c:\home\site\wwwroot installiert ist. Passen Sie diese Werte für Ihre Pfade entsprechend an.

  1. Ändern Sie den PythonHandler-Eintrag in der web.config-Datei, damit der Pfad mit dem Installationsort von Python übereinstimmt. Weitere Informationen finden Sie unter IIS-Konfigurationsreferenz (iis.net).

    <system.webServer>
       <handlers>
         <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
             scriptProcessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py"
             resourceType="Unspecified" requireAccess="Script"/>
       </handlers>
    </system.webServer>
    
  2. Fügen Sie im Abschnitt <appSettings> der Datei web.config Schlüssel für WSGI_HANDLER, WSGI_LOG (optional) und PYTHONPATH hinzu:

    <appSettings>
       <add key="PYTHONPATH" value="c:\home\site\wwwroot"/>
       <!-- The handler here is specific to Bottle; see the next section. -->
       <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
       <add key="WSGI_LOG" value="c:\home\LogFiles\wfastcgi.log"/>
    </appSettings>
    

    Diese <appSettings>-Werte stehen Ihrer App als Umgebungsvariablen zur Verfügung:

    • Der Wert für den Schlüssel PYTHONPATH kann beliebig erweitert werden, muss aber das Stammverzeichnis Ihrer Anwendung enthalten.
    • Der Schlüssel WSGI_HANDLER muss auf eine WSGI-Anwendung verweisen, die von Ihrer Anwendung importiert werden kann.
    • Der Schlüssel WSGI_LOG ist optional, wird aber zum Debuggen Ihrer Anwendung empfohlen.
  3. Legen Sie den WSGI_HANDLER-Eintrag auf die web.config-Datei fest, die für das von Ihnen verwendete Framework angemessen ist:

    • Bottle: Fügen Sie nach dem Wert app.wsgi_app Klammern hinzu, wie in diesem Beispiel gezeigt. Die Klammern sind notwendig, weil es sich bei dem Objekt um eine Funktion und nicht um eine Variable handelt. Sie können die Syntax in der Datei app.py sehen.

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask: Ändern Sie den Wert WSGI_HANDLER in <project_name>.app, wobei das <project_name>-Element dem Namen Ihres Projekts entspricht. Den genauen Bezeichner finden Sie in der Anweisung from <project_name> import app in der Datei runserver.py. Wenn das Projekt zum Beispiel FlaskAzurePublishExample heißt, sieht der Eintrag wie folgt aus:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django: Für Django-Projekte müssen Sie zwei Änderungen an der web.config-Datei für Django-Projekte vornehmen.

      • Ändern Sie den WSGI_HANDLER-Wert in django.core.wsgi.get_wsgi_application(). Das Objekt befindet sich in der Datei wsgi.py.

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • Fügen Sie den folgenden Eintrag unmittelbar nach dem Eintrag für den Schlüssel WSGI_HANDLER ein. Ersetzen Sie den Wert DjangoAzurePublishExample durch den Namen Ihres Projekts:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. Nur Django-App: Fügen Sie in der Datei settings.py des Django-Projekts die URL-Domain oder IP-Adresse Ihrer Website in den Eintrag ALLOWED_HOSTS ein. Ersetzen Sie „1.2.3.4“ durch Ihre URL oder IP-Adresse:

    # Change the URL or IP address to your specific site
    ALLOWED_HOSTS = ['1.2.3.4']
    

    Wenn Sie Ihre URL nicht zu den Array-Ergebnissen hinzufügen, wird die folgende Fehlermeldung angezeigt:

    DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
    

Wenn das Array leer ist, erlaubt Django automatisch 'localhost' und '127.0.0.1' als Hosts. Wenn Sie Ihre Produktions-URL hinzufügen, werden diese Host-Sites nicht automatisch zugelassen. Aus diesem Grund sollten Sie getrennte Entwicklungs- und Produktionskopien der Datei settings.py pflegen oder Umgebungsvariablen zur Steuerung der Laufzeitwerte verwenden.

Bereitstellung auf IIS oder einer virtuellen Windows-Maschine

Wenn Sie die korrekte web.config-Datei in Ihrem Projekt haben, können Sie über Solution Explorer auf dem Computer veröffentlichen, auf dem IIS ausgeführt wird. Klicken Sie mit der rechten Maustaste auf das Projekt, wählen Sie Publish, und wählen Sie dann IIS, FTP usw.. In diesem Fall kopiert Visual Studio nur die Projektdateien auf den Server. Sie sind für die gesamte serverseitige Konfiguration verantwortlich.