Jak skonfigurować Python na FastCGI na IIS
Oto, jak skonfigurować Python na FastCGI IIS 7+ z, otwiera drogę do przyzwoitej konfiguracji DJango
... i być w stanie podłączyć debugera do procesu, umożliwiając przejście przez kod Pythona
W tym przykładzie nie użyto konsoli zarządzania IIS, ale wymieniono zawartość wynikowych plików konfiguracji
Krok 1
Zainstaluj Python + dobry debugger (w tym przykładzie użyto WingIDE, które znalazłem doskonałe narzędzie) W tym przykładzie założono folder c: \ python27
Krok 2
Utwórz folder internetowy, np. Na localhost c: \ inetpub \ wwwroot \ mypythonfolder i umieść w nim następujący plik web.config:
Uwaga | znak potoku w dyrektywie scriptProcessor. Jest to używane przez IIS do mapowania skryptu na aplikację fastCgi (krok 3). Powinien pasować znak po znaku pełna ścieżka + znak potoku + ustawienia argumentów z kroku 3 poniżej.
Krok 3
W pliku applicationHost.config w folderze c: \ windows \ system32 \ inetsrc \ config umieść w sekcji:
<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>
Krok 4
W c: \ python27 \ lib \ mylib \ myfcgi.py wstaw następujący kod:
import wingdbstub
import os, io, sys ret = "środowisko: \ r \ n" dla param w 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 uchwyt = io.open ("c: \ temp \ myfcgi.log", 'wb') handle.write (ret) handle.close ()
Krok 5
Upewnij się, że IUSR ma prawa do zapisu w twoim folderze c: \ temp
Krok 6
Umieść wingdbstub.py i wingdebugpw w folderze c: \ python27 \ lib \ mylib \. Umożliwi to debugowanie w Wingide. Te pliki są dostarczane wraz z instalacją skrzydła. Uwaga: jeśli Python musi również skompilować kod do wingstub.pyc, IUSR potrzebuje praw do zapisu w tym folderze, ponieważ proces python zostanie uruchomiony na tym koncie przez IIS
Krok 6
Otwórz wingdb i ustaw punkt przerwania w linii „import os, io, sys”
Krok 7
Kliknij w przeglądarce http: // localhost / mypythonfolder
Jeśli wszystko działa poprawnie, należy teraz uruchomić Wingide, aby wyświetlić działający kod w punkcie przerwania. Jeśli nie: - istnieje problem z zaporą ogniową. Proces python komunikuje się z interfejsem WingIDE przez połączenie TCP - lub występuje problem z bezpieczeństwem w Wingide. Potrzebuje odpowiedniej wersji pliku wingdebugpw, który zasadniczo zawiera hasło lub token, który weryfikuje dostęp do twojej instalacji wingide. Gdyby tak nie było, każdy, kto ma dostęp tcp do twojego komputera, mógłby debugować kod.
Krok 8
Sprawdź, czy w c: \ temp plik dziennika został utworzony. Powinno to również działać, jeśli nie możesz rozpocząć kroku 7
Krok 9
Zauważ, że ta strona uruchamia debugger, ale nie zwraca żadnej strony do przeglądarki. Trochę tła: serwer sieciowy komunikuje się fastcgi poprzez tak zwane „rekordy”. Oznacza to, że każde żądanie użytkownika przychodzi do aplikacji spakowane w wielu osobnych „rekordach”. Każdy rekord jest strukturą danych, która wskazuje początek żądania, kwerendę, zmienne pocztowe itp. Rozpakowanie tych rekordów do pojedynczego żądania jest dość kłopotliwe, postępuje zgodnie ze specyfikacją fastcgi
http: //www.fastcgi .com / devkit / doc / fcgi-spec.html # S1
Jako zawartość c: \ python27 \ lib \ mylib \ myfcgi.py właśnie wrzuciłem kopię pliku zoofcgi.py dostarczonego przez helicontech. Ten plik python jest w stanie dekodować te rekordy i wyświetlać stronę i jest całkiem interesujący do debugowania. Zauważ też, że helicontech opcjonalnie dostarcza dll, który znajduje się pomiędzy IIS a zoofcgi.py, ale ta dll nie jest absolutnie konieczna. Wierzę, że implementuje nieco ulepszoną i ogólną wersję implementacji fastcgi, którą zapewnia msft. Jednak gdy używasz ich biblioteki dll, gdy chcesz przejść przez kod, proces zostaje dość szybko zakończony, a biblioteka IIS / DLL zabija proces Pythona, gdy stwierdza, że odpowiedź nie wraca w ciągu sekundy lub 2.
Otóż to. Zasadniczo komunikacja między IIS a kodem Pythona odbywa się za pomocą nazwanych potoków. Powinieneś być w stanie skonfigurować go za pomocą gniazd Tcp, ale nie byłem w stanie dowiedzieć się, który port jest używany (uważam, że stdin powinien zostać przekształcony w port, który można następnie wybrać () ed, ale tego nie dałem każda próba)