Как развернуть приложение Flask в IIS? - PullRequest
25 голосов
/ 22 февраля 2011

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

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

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)

Ответы [ 3 ]

50 голосов
/ 01 марта 2014

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

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 (я использовал David Ebbo ). Вы можете хотеть "официальную" версию отсюда .

Установите скрипт 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 \ Администраторы: полный контроль над этой папкой, подпапками и файлами
    • CREATOR OWNER: Полный контроль только для подпапок и файлов
    • NT AUTHORITY \ NETWORK SERVICE: разрешения на чтение для этой папки, подпапок и файлов
    • NT AUTHORITY \ SYSTEM: полный контроль над этой папкой, подпапками и файлами
  • Добавьте любую необходимую локальную конфигурацию (мое приложение использует файл local.cnf, который игнорируется системой контроля версий) - например, URL базы данных.

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

Шаг 6: создайте virtualenv для вашего приложения

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

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

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

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

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

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

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

Предоставьте права доступа Read и Script ( Run Scripts ) для узла.

Шаг 9: настроить fcgiext.ini

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

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

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

Используйте эти параметры для:

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

    • Для всего веб-сайта добавьте *:<b>{site id}</b>=<b>{application name}</b> в раздел [Types].
    • Для виртуального каталога добавьте *:/lm/w3svc/<b>{site id}</b>/root/<b>{path to app}</b>=<b>{application name}</b> в раздел [Types].
  • Добавить секцию обработки ([<b>{application name}</b>]) с параметрами для этого приложения ( полная ссылка ):

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

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

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

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

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

    • Исполняемый файл - это библиотека расширения FastCGI, установленная на шаге 1. Его расположение по умолчанию: %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 выполняет расширение переменной (среды) (используя стандартную запись Windows %VAR%) для значения 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 cЗначительно зависает в IIS 7. Начиная с этой версии, FastCGI имеет поддержку напрямую через IIS и не настраивается через расширение (т. е. шаг 1.4 не является необходимым, а fcgiext.ini не контролирует поведение FastCGI для IIS 7+ и не требуетсоздать / редактировать его).Вместо этого убедитесь, что CGI включен в Службы IIS в Панель управления> Программы и компоненты> Включение или отключение функций Windows .

Web.config

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

  • path: *
  • глагол: *
  • модули: 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.
  • Убедитесь, что в новой записи приложения FastCGI установлена ​​переменная среды PYTHONPATH, включающая коренькодовая база вашего приложения.Совет по добавлению пустой записи PYTHONPATH в <applicationSettings> вашего Web.config может не относиться к этой версии IIS.
3 голосов
/ 11 марта 2011

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

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

0 голосов
/ 27 февраля 2011

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

IIS <--> CGI <--> WSGI

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

...