Как развернуть приложение Flask в IIS?

Может ли кто-нибудь помочь мне запустить приложение Flask на IIS 6? Я попытался использовать isapi-wsgi, но когда я захожу по адресу виртуального каталога, я получаю страницу с сообщением: «Указанный модуль не может быть найден». Есть ли для этого другие варианты?

Ниже приведен сценарий Python, который я написал для isapi-wsgi. Виртуальный каталог был создан, и в диспетчере IIS все выглядело нормально, но сайт не работал.

from wof import app
import os

app.secret_key=os.urandom(24)

import isapi_wsgi
def __ExtensionFactory__():
    return isapi_wsgi.ISAPISimpleHandler(app)

if __name__ == '__main__':
    from isapi.install import *
    params = ISAPIParameters()
    sm = [ScriptMapParams(Extension="*", Flags=0)]
    vd = VirtualDirParameters(Name="WOFPy_Sondes", Description="ISAPI-WSGI for WOFPY Sondes test", ScriptMaps=sm, ScriptMapUpdate="replace")
    params.VirtualDirs = [vd]
    HandleCommandLine(params)

person James    schedule 21.02.2011    source источник


Ответы (3)


Обзор высокого уровня

HTTP -> IIS -> ISAPI -> FastCGI -> WSGI (приложение Flask)


Шаги настройки

Шаг 1. Установите необходимые двоичные файлы

  1. Установите Python (2.7 или 3.x - я использовал 3.3)
  2. Установите pip-Win (я использовал версию 1.6)
  3. Установите pywin32 (я использовал версию 218)
  4. Установите расширение IIS FastCGI с помощью fcgisetup 1.5

Шаг 2. Установите дополнительные двоичные пакеты

Я установил pyodbc с помощью установщика .exe с этого сайта. Для установки из источника (например, pip для установки в виртуальную среду) требуется компилятор C / C ++.

Шаг 3. Получите копию wfastcgi.py

Выберите версию, которая подойдет вам, предпочтительно ту, которая поддерживает Python 3.3 (я использовал Дэвида Эббо). Вы можете получить "официальную" версию отсюда.

Установите wfastcgi.py скрипт в C:\Inetpub\wwwroot и убедитесь, что учетная запись, которая будет обслуживать ваше приложение (по умолчанию «Сетевая служба»), имеет доступ для чтения к ней.

Шаг 4: Установите virtualenv в Системные сайты-пакеты

C:\Python33\Scripts\pip.exe install virtualenv

(если вы используете Python 3.3 и установили все в папку по умолчанию)

Шаг 5. Установите приложение Flask

  • Вы можете установить приложение практически в любом месте системы. Вы можете установить его в C:\Inetpub. В этом руководстве мы назовем корневую папку вашего приложения установкой %APPROOT%. (Не помещайте кавычки в переменную среды.)

  • Убедитесь, что учетная запись, которая будет обслуживать ваше приложение (по умолчанию «Сетевая служба»), имеет доступ для чтения ко всем файлам сценариев. Эта команда:

    cacls "%APPROOT%" /S:"D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;NS)(A;OICI;FA;;;SY)"
    

    предоставит вашему каталогу приложения следующие разрешения:

    • BUILTIN\Administrators: Full control of this folder, subfolders, and files
    • СОЗДАТЕЛЬ ВЛАДЕЛЬЦА: Полный доступ только для вложенных папок и файлов
    • NT AUTHORITY \ NETWORK SERVICE: разрешения на чтение для этой папки, подпапок и файлов
    • NT AUTHORITY \ SYSTEM: полный контроль над этой папкой, вложенными папками и файлами
  • Добавьте любую необходимую локальную конфигурацию (мое приложение использует файл local.cnf, который игнорируется системой контроля версий) - например, URL-адреса базы данных.

  • Убедитесь, что ваше приложение содержит Web.config файл в %APPROOT% - информацию о формате файла см. В разделе ниже.

Шаг 6. Создайте виртуальную среду для вашего приложения

C:\Python33\Scripts\virtualenv.exe --system-site-packages "%APPROOT%\env"

(Выберите имя, отличное от env, если ваше приложение уже использует этот каталог.)

Шаг 7. Установите пакеты, необходимые для вашего приложения, на виртуальный сервер.

cd "%APPROOT%"
env\Scripts\activate
pip install -r Packages

(В моем проекте спецификации требований хранятся в файле с именем Packages.)

Шаг 8: Создайте веб-сайт или виртуальный каталог для вашего приложения

Используйте inetmgr.msc (Пуск -> Выполнить…, затем введите inetmgr в поле редактирования и нажмите ENTER), чтобы запустить Internet Information Services ( IIS) Менеджер. Обязательно укажите локальный путь для создаваемого вами узла (веб-сайта или виртуального каталога) в корневую папку вашего приложения Flask. wfastcgi.py использует локальный путь для идентификации приложения Flask для обработки запросов.

Предоставьте узлу права доступа как для чтения, так и для сценария (запуска сценариев).

Шаг 9. Настройте fcgiext.ini

Этот файл находится в том же каталоге, что и fcgiext.dll, установленный на шаге 1 (по умолчанию %SYSTEMROOT%\system32\inetsrv).

При настройке этого файла вам потребуется несколько параметров:

  • {site id}: числовой идентификатор сайта, который вы можете найти на панели подробностей (справа) Диспетчера информационных служб Интернета (IIS), когда выбрано «Веб-сайты». из дерева в левой части окна.
  • {имя приложения}: имя раздела в fcgiext.ini, который предоставляет параметры для обработчика FastCGI (ISAPI). Вы выбираете это значение - выбираете то, что представляет ваше приложение.
  • {путь к приложению}: для виртуального каталога - URL-путь внутри веб-сайта к виртуальному каталогу, который будет обрабатываться.
  • {Approot}: путь к корневому каталогу вашего приложения.

Используйте эти параметры, чтобы:

  • Сопоставьте запросы FastCGI с разделом обработки:

    • For a whole Web Site, add *:{site id}={application name} to the [Types] section.
    • Для виртуального каталога добавьте *:/lm/w3svc/{site id}/root/{path to app}={application name} в раздел [Types].
  • Добавьте раздел обработки ([{application name}]) с параметрами для этого приложения (полный справочник):

    • ExePath={approot}\env\python.exe
    • Arguments=C:\Inetpub\wwwroot\wfastcgi.py (или там, где установлен wfastcgi.py скрипт адаптера)
    • EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value,etc. (правила цитирования см. В полной справке). Это хорошее место для установки вашей переменной среды WSGI_LOG - убедитесь, что учетная запись, обслуживающая сайт («Сетевая служба ”По умолчанию) имеет права на запись в файл и (если файл не существует) разрешение на добавление файла в содержащий каталог.

Шаг 10: Настройте обработку FastCGI для целевых URL-адресов

Используя Диспетчер информационных служб Интернета (IIS), выберите «Свойства ...» в контекстном меню (щелчок правой кнопкой мыши) узла (веб-сайт или виртуальный каталог), который будет обслуживаться вашим приложением Flask, и :

  • На вкладке «Домашний каталог» (веб-сайт) или «Виртуальный каталог» (виртуальный каталог) нажмите кнопку «Конфигурация ...».

  • В разделе «Карты приложений с подстановочными знаками» используйте кнопку «Вставить ...», чтобы добавить сопоставление с подстановочными знаками:

    • The executable is the FastCGI extension DLL installed in Step 1. Its default location is %SYSTEMROOT%\system32\inetsrv\fcgiext.dll.
    • Убедитесь, что флажок «Проверить, существует ли файл» снят. Приложения Flask выполняют свою собственную маршрутизацию, которая не обязательно имеет какое-либо отношение к файлам на диске.

Web.config

Этот файл (в данной настройке) читает wfastcgi.py, а не IIS.

<?xml version="1.0" encoding="UTF-8"?>

<configuration>
    <applicationSettings>
        <add key=“PYTHONPATH” value=“”/>
        <add key=“WSGI_HANDLER” value=“module.application”/>
    </applicationSettings>
</configuration>
  • <add> элементы добавляют переменные среды (os.environ в Python).

  • WSGI_HANDLER должен быть указан - он сообщает wfastcgi.py, как найти объект приложения WSGI. Если значение заканчивается на «()», wfastcgi.py вызовет названный объект, ожидая, что он вернет объект приложения WSGI.

  • PYTHONPATH обрабатывается особым образом - wfastcgi.py выполняет расширение переменной (среды) (с использованием стандартной %VAR% нотации Windows) для значения PYTHONPATH, затем разделяет результат на точки с запятой и добавляет записи в sys.path перед вызовом приложения WSGI. Поскольку wfastcgi.py изменяет текущий каталог на путь, указанный как локальный путь к веб-сайту или виртуальному каталогу перед импортом модуля, содержащего объект приложения WSGI, включение пустой строки в PYTHONPATH приведет к тому, что поиск будет включать каталог вашего приложения Flask в качестве отправная точка. Вы также можете установить PYTHONPATH в fcgiext.ini (в этом случае он включается в sys.path интерпретатором, а затем снова wfastcgi.py).

  • WSGI_RESTART_FILE_REGEX дает регулярное выражение Python, используемое для фильтрации уведомлений об изменении файлов для путей, которые должны запускать перезапуск процесса обработчика FastCGI. Установите это для срабатывания при изменении исходных файлов или файлов конфигурации. Пользуюсь (?i).*\.(py|cnf|config)$.

  • WSGI_LOG можно установить здесь, но я думаю, что лучше установить fcgiext.ini.


Для IIS 7

Некоторые вещи с FastCGI кардинально изменились в IIS 7. Начиная с этой версии, FastCGI поддерживает напрямую через IIS и не настраивается через расширение (т.е. шаг 1.4 не нужен, а fcgiext.ini не контролирует поведение FastCGI для IIS 7+, и нет нужно создать / отредактировать). Вместо этого убедитесь, что CGI включен в разделе Информационные службы Интернета в Панель управления> Программы и компоненты> Включение или отключение компонентов Windows.

Web.config

IIS 7 - первая версия IIS, которая считывает параметры конфигурации, связанные с FastCGI, из файла Web.config. Ваш Web.config файл должен будет содержать в элементе <configuration> элемент <system.webServer>, содержащий элемент <handlers>, содержащий элемент <add> с атрибутами:

  • путь: *
  • глагол: *
  • модули: FastCgiModule
  • resourceType: Unspecified
  • requireAccess: Script
  • scriptProcessor: сложный

Атрибут scriptProcessor

Этот атрибут элемента <add> должен содержать полный путь к файлу интерпретатора Python .exe, который вы хотите использовать (тот, который находится в подпапке Scripts вашего Python virtualenv), за которым следует |, а затем полный путь к wfastcgi.py файлу, который вы используете. Поскольку эти пути зависят от настройки компьютера, на котором работает ваше приложение, вы можете установить этот атрибут как часть процесса развертывания.

Настройка на уровне сервера IIS

  • В inetmgr щелкните узел сервера в дереве, а затем выберите Настройки FastCGI на центральной панели. Появится список пар исполняемый файл / аргумент.
  • Добавьте запись для полных путей к вашим python.exe и wfastcgi.py, которые вы используете. Оба должны быть указаны так же, как они отображаются в элементе <handlers>/<add> в вашем Web.config.
  • Обязательно настройте переменную среды PYTHONPATH в новой записи приложения FastCGI, чтобы включить корень кодовой базы вашего приложения. Совет по добавлению пустой PYTHONPATH записи в <applicationSettings> вашего Web.config может не относиться к этой версии IIS.
person ReWrite    schedule 28.02.2014
comment
Это отличное резюме, только небольшая настройка с учетом изменений в Windows Server / IIS за последние 6 лет заключается в том, что пользователем по умолчанию теперь является IIS_USRS, а не сетевая служба. Возможно, вам потребуется разблокировать разделы конфигурации с помощью appcmd, расположенного в C: \ windows \ system32 \ inetsrv, используя команду appcmd unlock config /section:handler - person AndrewWhalan; 29.05.2020
comment
Можно ли запустить многопоточность в рамках одного рабочего процесса? Потому что, когда я развернул приложение, оно создавало новый процесс Python для каждого запроса. - person AutomationNerd; 17.04.2021

Посетите страницу Django по этой теме. Это помогло мне создать рабочий проект Django, но для приложения Flask он не должен сильно отличаться.

http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer

person Joe    schedule 11.03.2011
comment
ВЫ УВЕРЕНЫ В СВОЕМ ОТВЕТЕ? - person Lutaaya Huzaifah Idris; 24.03.2018

Я никогда не использую IIS, но IIS поддерживает шлюз CGI, поэтому вы сможете адаптировать CGI к WSGI.

IIS <--> CGI <--> WSGI

Чтобы запустить WSGI как сценарий CGI, вы можете использовать CGIHandler в стандартной библиотеке Python.

person Fang-Pen Lin    schedule 27.02.2011
comment
CGI не является приемлемым решением, если только это не очень вещь с низким трафиком (например, используется только вами). Он запускает процесс каждый раз, когда запрашивается страница. - person ThiefMaster; 11.03.2011