如何在IIS的FastCGI上设置Python
这是在FastCGI IIS 7+上设置Python的方法,为体面的DJango设置打开了道路
...并能够将调试器挂接到该过程中,从而使您能够逐步完成Python代码
本示例不使用IIS管理控制台,而是列出了生成的配置文件的内容
步骤1
安装Python +一个好的调试器(此示例使用WingIDE,我发现它是一个出色的工具)此示例假定文件夹c:\ python27
第2步
创建一个Web文件夹,例如在localhost c:\ inetpub \ wwwroot \ mypythonfolder上,然后将以下web.config文件放入其中:
注意| scriptProcessor指令中的竖线字符。IIS使用它来将脚本映射到fastCgi应用程序(第3步)。它应逐字符匹配以下步骤3中的全路径+竖线字符+参数设置。
第三步
在c:\ windows \ system32 \ inetsrc \ config文件夹中的applicationHost.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>
第四步
在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中的arg: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中启用调试。这些文件随wing安装一起提供。注意:如果Python还需要将代码编译到wingstub.pyc中,则IUSR需要对该文件夹具有写权限,因为IIS将在该帐户下启动python进程
第6步
打开wingdb并在“ import os,io,sys”行上设置一个断点
步骤7
在浏览器中点击http:// localhost / mypythonfolder
如果一切正常,现在应触发wingide在断点处显示正在运行的代码。如果不是:-要么存在防火墙问题。python进程通过tcp连接与WingIDE接口通信-或wingide中的安全性问题。它需要wingdebugpw文件的正确版本,该文件基本上包含用于验证对wingide安装进行访问的密码或令牌。如果不是这种情况,则可以通过tcp访问您PC的任何人都可以针对您的代码进行调试。
步骤8
验证是否在c:\ temp中创建了日志文件。如果您无法进行第7步,这也应该有效
步骤9
请注意,此页面会触发调试器,但不会将任何页面返回到Web浏览器。一些背景:Web服务器通过所谓的“记录”来传递fastcgi。这意味着每个单独的用户请求都以多个单独的“记录”打包到您的应用程序中。每个记录都是一个数据结构,该数据结构指示请求的开始,查询字符串,发布变量等。将这些记录解压缩为单个请求有点麻烦,它遵循http://www.fastcgi的fastcgi规范
.com / devkit / doc / fcgi-spec.html#S1
作为c:\ python27 \ lib \ mylib \ myfcgi.py的内容,我只是放入了由helicontech提供的zoofcgi.py的副本。这个python文件能够解码这些记录并提供页面,调试起来非常有趣。还要注意,helicontech可以选择提供一个位于IIS和Zoofcgi.py之间的dll,但是此dll并非绝对必要。我相信它实现了msft提供的fastcgi实现的稍有改进和通用版本。但是,当您使用他们的dll时,当您想要逐步执行代码时,该过程会相当快地终止,并且IIS / DLL会在几秒钟或2秒钟内认为没有响应返回时杀死了python进程。
而已。原则上,IIS和python代码之间的通信是通过命名管道完成的。您应该可以使用tcp套接字进行设置,但是我无法弄清楚使用哪个端口(我认为应该将stdin转换为可以进行select()的端口,但是我没有给出任何尝试)