Настройка веб-приложений Python для IIS

При использовании службы IIS (IIS) в качестве веб-сервера на компьютере Windows (включая виртуальные машины Windows в Azure), необходимо настроить веб-приложение Python для правильной обработки кода Python. Конфигурация выполняется с помощью параметров в web.config файле веб-приложения Python. В этой статье описывается настройка необходимых параметров.

Необходимые компоненты

  • Python в Windows установлен. Чтобы запустить веб-приложение, сначала установите нужную версию интерпретатора Python непосредственно на рабочий компьютер, как описано в этой статье.

    • Определите расположение python.exe интерпретатора. Для удобства это расположение можно добавить в переменную среды PATH.
  • Необходимые пакеты установлены. Для выделенного узла можно использовать глобальную среду Python для запуска приложения, а не виртуальной среды. Соответственно, вы можете установить все требования приложения в глобальную среду, выполнив pip install -r requirements.txt команду.

Указание интерпретатора Python в файле web.config

Файл web.config для приложения Python указывает веб-серверу IIS (версии 7 или более поздней версии), работающему в Windows, о том, как он должен обрабатывать запросы Python через HttpPlatformHandler (рекомендуется) или FastCGI. Visual Studio 2015 и более ранних версий вносит эти изменения автоматически. Для Visual Studio 2017 и более поздних версий web.config необходимо вручную изменить файл.

Если проект еще не содержит web.config файл, его можно добавить, щелкнув правой кнопкой мыши каталог проекта, выбрав "Добавить > новый элемент " и выполнив поиск web.config или создав пустой web.config XML-файл.

Настройка HttpPlatformHandler

Модуль HttpPlatform передает подключения через сокет напрямую в автономный процесс Python. Эта сквозная передача позволяет запускать любой веб-сервер, который вам нравится, но для этого требуется скрипт запуска, на котором выполняется локальный веб-сервер. Этот подход обычно выполняется с помощью веб-платформы Python, например Flask или Django. Скрипт указывается в <httpPlatform> элементе web.config файла. Атрибут processPath указывает на интерпретатор Python расширения сайта. Атрибут arguments указывает на скрипт запуска, на котором выполняется локальный веб-сервер, в данном случае runserver.pyи любые аргументы, которые вы хотите предоставить:

<?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>

В этом примере HTTP_PLATFORM_PORT переменная среды содержит порт, который должен прослушивать локальный сервер для подключений.localhost В этом примере также показано, как создать другую переменную среды. SERVER_PORT При необходимости можно создавать и назначать переменные среды.

Настройка обработчика FastCGI

FastCGI — это интерфейс, работающий на уровне запроса. Службы IIS принимают входящие подключения и перенаправляют каждый запрос в приложение WSGI, работающее в одном или нескольких сохраняемых процессах Python.

Примечание.

Мы рекомендуем использовать HttpPlatformHandler для настройки приложений, так как проект WFastCGI больше не поддерживается.

Чтобы использовать FastCGI, сначала установите и настройте пакет wfastcgi, как описано в pypi.org/project/wfastcgi/.

Затем измените файл приложения web.config , чтобы включить полные пути к python.exe исполняемому файлу и wfastcgi.py файлу PythonHandler в ключе. В следующих шагах предполагается, что Python установлен в папке c:\python36-32 , а код приложения находится в папке c:\home\site\wwwroot . Настройте эти значения для путей соответствующим образом.

  1. Измените PythonHandler запись в web.config файле, чтобы путь соответствовал расположению установки Python. Дополнительные сведения см. в справочнике по конфигурации IIS (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. <appSettings> В разделе web.config файла добавьте ключи для WSGI_HANDLER, WSGI_LOG (необязательно) иPYTHONPATH:

    <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>
    

    Эти значения <appSettings> доступны для вашего приложения в качестве переменных среды:

    • Значение ключа PYTHONPATH может быть свободно расширено, но оно должно содержать корневой каталог приложения.
    • Ключ WSGI_HANDLER должен указывать на приложение WSGI, импортируемое из приложения.
    • Ключ WSGI_LOG является необязательным, но ключ рекомендуется для отладки приложения.
  3. WSGI_HANDLER Задайте запись в web.config файле соответствующим образом для используемой платформы:

    • Бутылка: добавьте скобки после app.wsgi_app значения, как показано в этом примере. Скобки необходимы, так как объект является функцией, а не переменной. Синтаксис можно увидеть в app.py файле.

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask: измените значение WSGI_HANDLER на <project_name>.app, где <project_name> соответствует имени проекта. Точный идентификатор можно найти, просмотрев инструкцию from <project_name> import apprunserver.py в файле. Например, если проект называется FlaskAzurePublishExample, запись отображается следующим образом:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django: для проектов Django необходимы web.config два изменения.

      • Измените значение WSGI_HANDLER на django.core.wsgi.get_wsgi_application(). Объект находится в wsgi.py файле.

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • Добавьте следующую запись сразу после записи ключа WSGI_HANDLER . Замените значение DjangoAzurePublishExample именем проекта:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. Только приложения Django: в файле проекта settings.py Django добавьте домен или IP-адрес сайта в ALLOWED_HOSTS запись. Замените "1.2.3.4" URL-адресом или IP-адресом:

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

    Если вы не добавляете URL-адрес в результаты массива, вы увидите следующую ошибку:

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

Если массив пуст, Django автоматически разрешает 'localhost' и '127.0.0.1' как узлы. Если вы добавите рабочий URL-адрес, эти сайты узлов не допускаются автоматически. По этой причине может потребоваться сохранить отдельные копии settings.py файла разработки и рабочей среды или использовать переменные среды для управления значениями среды выполнения.

Развертывание в IIS или виртуальной машине Windows

Если в проекте есть правильный web.config файл, вы можете опубликовать его на компьютере под управлением IIS из Обозреватель решений. Щелкните проект правой кнопкой мыши, выберите "Опубликовать", а затем выберите IIS, FTP и т. д. В этом случае Visual Studio копирует только файлы проекта на сервер. Вы отвечаете за всю конфигурацию на стороне сервера.