Як налаштувати 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). Він повинен відповідати символу за символом налаштуванням fullpath + pipe + + аргументів із кроку 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
import os, io, sys ret = "середовище: \ r \ n" для парами в os.environ.keys (): ret = ret + "% s =% s \ r \ n"% (param, os.environ [ param]) ret = ret + "\ r \ nArgs:" for arg in 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 \. Це дозволить налагоджувати в крилатій частині. Ці файли надаються при встановленні крила. Примітка: якщо Python також повинен скомпілювати ваш код у wingstub.pyc, IUSR потребує прав на запис у цю папку, оскільки процес Python буде запущений під цим обліковим записом IIS
Крок 6
Відкрийте wingdb і встановіть точку розриву на лінії 'import os, io, sys'
Крок 7
Натисніть у своєму браузері http: // localhost / mypythonfolder
Якщо все працює правильно, тепер слід спрацьовувати, щоб відобразити запущений код у точці розриву. Якщо ні: - або проблема з брандмауером. Процес python зв’язується з інтерфейсом WingIDE через tcp-з'єднання - або виникає проблема із захистом всередині крила. Для цього потрібна належна версія файлу wingdebugpw, яка в основному містить пароль або маркер, що підтверджує доступ до вашої інсталяції. Якщо це не так, хтось із доступом до 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 та вашим пітон-кодом здійснюється з іменованими каналами. Ви повинні бути в змозі налаштувати його за допомогою сокетів tcp, але я не зміг зрозуміти, який порт використовується (я вважаю, що stdin повинен бути перетворений на порт, який потім можна вибрати () ed, але я цього не дав будь-яка спроба)