it-swarm.com.ru

Получение 500 Внутренняя ошибка сервера при настройке Python и ​​Flask с FastCgiModule в Windows

Кто-нибудь может настроить Python с IIS? Я пытался понять это, но это не работает, и это сводит меня с ума. Я вижу множество примеров, но я не могу заставить его работать.


Вот моя установка


  • Windows 2008R2
  • IIS 7.5 (7.5.7600.16385)
  • wfastcgi.py (2.2.0)
  • Колба (0.10.1)
  • Python (3.5.1)

Путь к веб-приложению Python + Flask

C:\inetpub\wwwroot

Вот шаги, за которыми я следовал:

  1. Убедитесь, что установлена ​​функция CGI Windows.
  2. В диспетчере IIS, выделенном веб-сервере и в настройках FastCGI добавлено приложение со значениями:

    Full Path: C:\python35\python.exe
    
    Arguments: C:\inetpub\wwwroot\wfastcgi.py
    
    Environment Variable Collection:
    
      PYTHONPATH: C:\inetpub\wwwroot\
      WSGI_HANDLER: app.app
      WSGI_LOG: C:\logs\app.txt
    
  3. Создан веб-сайт MyWebSite, указывающий на C:\inetpub\wwwroot

  4. В настройках сопоставления обработчика для веб-сайта добавлено сопоставление модуля для FastCgiModule:

    Request path: *
    Module: FastCgiModule
    Executable: C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py
    Name: FlaskHandler
    

Простое приложение Python с использованием Flask найдено в Интернете и добавлено в корневую папку. Таким образом, в C:\inetpub\wwww есть только 3 файла: app.py, web.config и wfastcgi.py

web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appSettings>
        <add key="PYTHONPATH" value="" />
        <add key="WSGI_HANDLER" value="app.app" />
        <add key="WSGI_RESTART_FILE_REGEX" value="(?i).*\.(py|cnf|config)$" />
    </appSettings>
    <system.webServer>
        <handlers>
            <add name="FlaskHandler" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\python35\python.exe|C:\inetpub\wwwroot\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
    </system.webServer>
</configuration>

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from FastCGI via IIS!"

if __== "__main__":
    app.run()

applicationHost.config:

раздел глобального модуля:

<add name="FastCgiModule" image="%windir%\System32\inetsrv\iisfcgi.dll" />

раздел модуля:

<add name="FastCgiModule" lockItem="true" />

раздел системного веб-сервера:

<section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" />
...
<fastCgi>
    <application fullPath="C:\Python35\python.exe" arguments="C:\inetpub\wwwroot\wfastcgi.py">
        <environmentVariables>
            <environmentVariable name="PYTHONPATH" value="C:\inetpub\wwwroot\" />
            <environmentVariable name="WSGI_HANDLER" value="app.app" />
        <environmentVariable name="WSGI_LOG" value="c:\logs\my_log.txt" />
        </environmentVariables>
    </application>
</fastCgi>

Так что по некоторым причинам это не работает, как ожидалось.

Вот что я испытываю:

HTTP Error 500.0 - Internal Server Error

C:\python35\python.exe - The FastCGI process exited unexpectedly

Вещи, которые я пробовал.

Скриптовый обработчик для обработчика не вызывается правильно. Кажется, он вызывается, потому что когда я изменяю значение на что-то другое, я получаю сообщение об ошибке:

HTTP Error 500.0 - Internal Server Error
<handler> scriptProcessor could not be found in <fastCGI> application configuration

Я думал, что это было разрешением, поэтому я убедился, что NETWORK SERVICE учетная запись имеет Read & Execute. Я даже дал всем аккаунт Полный контроль. Я считаю, что NETWORK SERVICE это учетная запись, для которой требуется разрешение, я думаю.

Я добавил логирование для выхода из отладочной информации в app.py. Я не получил никакой информации, чтобы можно было записать файл журнала. Я не уверен, как wfastcgi.py использует конфигурации IIS, даже если я добавил его в web.config, чтобы указать расположение файла журнала. Может быть, если на самом деле вызывается scriptProcessor, он в конце концов настроит его. Но, глядя на код, кажется, что используется системная переменная среды, поэтому я просто добавил значение WSGI_LOG в качестве переменной среды ОС. Все еще не записывает отладочную информацию в файл журнала.

Поэтому я попытался запустить исполняемый файл python с файлом wfastcgi в качестве аргумента прямо в командной строке, и, похоже, он работает, как ожидалось, введя wfastcgi while loop и ожидая запрос. И это также записывает отладочную информацию в файл журнала.

python.exe c:\inetpub\wwwroot\wfastcgi.py

И когда я запускаю сервер python, он работает, когда я в браузере перехожу на localhost: 8081, поэтому я подозреваю, что это настройка.

python app.py runserver 0.0.0.0:8081

Так, что происходит. У меня нет идей. Любая помощь будет оценена.

Спасибо! Это сводит меня с ума.

7
JQ9

Я знаю, что этому вопросу уже несколько месяцев, но я думаю, что мне нужно поделиться своим решением. Это действительно может помочь кому-то, оказавшемуся в такой же ситуации, так как я не смог найти ни одного человека с этой проблемой. Мы были в двух дюймах от того, чтобы отказаться от альтернативного менеджера серверов, так как я потратил не менее целого дня работы над этой проблемой, обходя весь интернет, пытаясь найти объяснение или какой-либо ключ к работе.

Похоже, что у меня возникла проблема:

Исполняемый (необязательно):C:\Python27\python.exe | C:\Python27\Scripts\wfastcgi.py

Что было сделано, так это удалить интервал между путями в поле "Исполняемый файл (необязательно)". Я глубоко предполагал, что такое поле, содержащее два ввода, было достаточно любезно, чтобы обрезать проанализированные значения, поэтому я каждый раз делал одно и то же расстояние. Но я был не прав, и моя полученная конфигурация представляла собой карту с путём гэмбла, с пробелом перед ним и прочим. После удаления всех пробелов, на которые мне очень неудобно смотреть, он заработал, как и ожидалось, даже без необходимости удалять обработчик и возвращать его обратно. Такого рода удалите его и попробуйте снова предложения на форумах IIS, которые загрязняют мнение разработчика ложным убеждением, что все должно быть отменено, когда это действительно просто нуждается в хороших конфигурациях.

Рабочий вход:

Исполняемый (необязательно):C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py

Я надеюсь, что это кому-то поможет, и если разработчик MS попадет сюда случайно, пожалуйста, удалите этот злой хак поля с двойным вводом, поскольку впоследствии он разделен на два отдельных поля, если вы перейдете в Настройки fastCgi на глобальном уровне, и это просто вводит в заблуждение попросить два входа в одном поле где-нибудь еще. По крайней мере, обрежьте оба значения, чтобы опытные специалисты по заполнению входного списка больше никогда не сталкивались с этой проблемой! Очень странно сталкиваться с проблемой, когда ошибка говорит о том, что в основном то, что вы только что ввели, отсутствует.

Update:

Стоит отметить, что в конце вы должны предоставить объект приложения внутри модуля python IIS и ​​ничего более. Некоторым это может показаться очевидным, но это не очень хорошо задокументировано, и произойдет сбой, если модуль python действительно запустит приложение на его стороне. Это абсолютно необходимо для того, чтобы иметь рабочую среду разработки:

Python - app.py

# <imports...>
# <routes...>
myApp.secret_key = 'this-is-a-secret-key'

if __== '__main__':
   # start application in python

# IIS will get access to variable `myApp` and start it himself,
# without starting it twice because IIS won't run the script
# as `__main__`. In this scenario `WSGI_HANDLER` will be required
# to have `app.myApp` to reach your application.

Ваше приложение внутри IIS выполнит свою работу. И вы все равно сможете запустить его в режиме отладки с помощью python app.py.

2
Frederik.L

Исходя из описания, похоже, что вам нужно внести некоторые изменения в конфигурацию IIS. У меня есть следующие параметры конфигурации для IIS 7.5 и запуска Python Flask с FastCgiModule. Вот шаги, которые вы можете предпринять:

  1. Открыть IIS Управление r. На левой панели, нажмите на "Имя сервера". Затем на средней панели дважды щелкните "Настройки FastCGI". Вам нужно нажать на Actions >> Add в правой панели и иметь две настройки. У меня есть Python 2.7, для вашего случая вы должны ввести путь для Python 3.5

enter image description here

  1. На IIS "Добавить веб-сайт", чтобы опубликовать веб-сайт . На приведенном ниже снимке экрана имя сайта - "pyprojects", а содержимое публикуется в физической папке "C:\inetpub\wwwroot\pyprojects".

enter image description here

  1. Выберите имя узла слева и дважды щелкните "Сопоставления обработчиков". На правой панели в разделе "Действия" нажмите "Добавить сопоставление модуля" и введите

    • Путь запроса: handler.fcgi
    • Модуль: FastCgiModule
    • Исполняемый файл: C:\Python27\python.exe|C:\Python27\Scripts\wfastcgi.py (путь к версии Python)
    • Имя: Python FastCGI

enter image description here

  1. Снова выберите имя слева. Теперь дважды щелкните "Настройки приложения". Для существующих конфигураций %ROOTDIR% необходимо заменить на каталог развертывания для PYTHONPATH и WSGI_ALT_VIRTUALENV_ACTIVATE_THIS.

enter image description here

  1. Просмотрите свой веб-сайт

Надеюсь, что это поможет вам и сэкономит время для тех, кто столкнется с той же проблемой в будущем.

2
gmsi