Как настроить Python на FastCGI на IIS
Вот как настроить Python на FastCGI IIS 7+, открывая путь для достойной настройки DJango
... и иметь возможность подключить отладчик к процессу, позволяющему вам шагать по коду Python
В этом примере не используется консоль управления IIS, а перечислено содержимое полученных файлов конфигурации.
Шаг 1
Установите Python + хороший отладчик (в этом примере используется WingIDE, который я нашел отличным инструментом) В этом примере предполагается, что папка c: \ python27
Шаг 2
Создайте веб-папку, например, на localhost c: \ inetpub \ wwwroot \ mypythonfolder и поместите в нее следующий файл web.config:
Обратите внимание на | символ трубы в директиве scriptProcessor. Это используется IIS для сопоставления сценария с приложением fastCgi (шаг 3). Он должен совпадать символ за символом с полными путями + символом трубы + параметрами аргументов, начиная с шага 3 ниже.
Шаг 3
В файле applicationHost.config в папке c: \ windows \ system32 \ inetsrc \ config поместите в раздел следующее:
<fastCgi>
<application fullPath="c:\python27\python.exe" arguments="c:\python27\lib\mylib\myfcgi.py" monitorChangesTo="C:\Python27\Lib\r4a\r4afcgi.py" stderrMode="ReturnStdErrIn500" maxInstances="4" idleTimeout="300" activityTimeout="300" requestTimeout="90" instanceMaxRequests="200" protocol="NamedPipe" queueLength="1000" flushNamedPipe="true" rapidFailsPerMinute="10" />
</fastCgi>
Шаг 4
В c: \ python27 \ lib \ mylib \ myfcgi.py поместите следующий код:
import wingdbstub
импортировать os, io, sys ret = "environment: \ r \ n" для параметра в os.environ.keys (): ret = ret + "% s =% s \ r \ n"% (param, os.environ [ param]) ret = ret + "\ r \ nArgs:" для аргумента в sys.argv: ret = ret + arg handle = io.open ("c: \ temp \ myfcgi.log", 'wb') handle.write (ret) handle.close ()
Шаг 5
Убедитесь, что у IUSR есть права на запись в вашу папку c: \ temp
Шаг 6
Поместите wingdbstub.py и wingdebugpw в вашу папку c: \ python27 \ lib \ mylib \. Это позволит отладку в wingide. Эти файлы предоставляются вместе с вашей установкой крыла. Примечание: если Python также должен скомпилировать ваш код в wingstub.pyc, IUSR нужны права на запись в эту папку, так как процесс Python будет запущен под этой учетной записью IIS
Шаг 6
Откройте wingdb и установите точку останова на строке import os, io, sys
Шаг 7
Нажмите в вашем браузере http: // localhost / mypythonfolder
Если все работает правильно, то должен сработать wingide для отображения кода выполнения на вашей точке останова. Если нет: - либо есть проблема с брандмауэром. Процесс python связывается с интерфейсом WingIDE через TCP-соединение - или есть проблема с безопасностью в wingide. Ему нужна правильная версия файла wingdebugpw, который в основном содержит пароль или токен, который проверяет доступ к вашей установке wingide. Если бы это было не так, любой, у кого есть tcp-доступ к вашему компьютеру, мог бы отладить ваш код.
Шаг 8
Убедитесь, что в c: \ temp создан файл журнала. Это также должно работать, если вы не можете выполнить шаг 7
Шаг 9
Обратите внимание, что эта страница запускает отладчик, но не возвращает ни одной страницы веб-браузеру. Немного предыстории: веб-сервер передает fastcgi через так называемые «записи». Это означает, что каждый запрос пользователя поступает в ваше приложение, упакованное в несколько отдельных «записей». Каждая запись представляет собой структуру данных, которая указывает начало запроса, строку запроса, переменные записи и т. Д. Распаковка этих записей в один запрос является довольно громоздкой, она соответствует спецификации fastcgi
http: //www.fastcgi. .com / DevKit / DOC / FCGI-spec.html # S1
Что касается содержимого c: \ python27 \ lib \ mylib \ myfcgi.py, я просто поместил копию zoofcgi.py, предоставленную helicontech. Этот файл python способен декодировать эти записи и обслуживать страницу и довольно интересен для отладки. Также обратите внимание, что helicontech дополнительно предоставляет dll, которая находится между IIS и zoofcgi.py, но эта dll не является строго необходимой. Я считаю, что он реализует слегка улучшенную и общую версию реализации fastcgi, которую предоставляет msft. Однако, когда вы используете их dll, когда вы хотите пройтись по коду, процесс завершается довольно быстро, и IIS / DLL убивает ваш процесс python, когда он приходит к выводу, что ответ не возвращается в течение секунды или 2.
Вот и все. В принципе, связь между IIS и вашим кодом на python осуществляется по именованным каналам. Вы должны иметь возможность настроить его с помощью сокетов tcp, но я не смог выяснить, какой порт используется (я считаю, что stdin должен быть преобразован в порт, который затем можно выбрать select () ed, но я этого не дал любая попытка)