由于无法控制的原因,我们的网站托pipe了一个使用IIS服务器的托pipe服务提供商。 他们目前提供PHP和ASP,以及Python和Perl通过CGI脚本。
我想做一个重新devise,重新编写我们的网站,并希望从PHP更改为Python / Django设置。 托pipe服务提供商可以提供build议,但是很清楚:“我们并不真正了解Python是什么,或者它是如何工作的,但是如果能够向我们解释,我们将尽力为您设置任何您需要的东西” 。
不过,我可能知道如何在apache / mod_python的共享主机环境中设置Django,但是我不知道如何在IIS上设置Django,当然也不知道如何设置共享主机环境。 我GOOGLE了一下,但我发现大部分资源假设系统pipe理员1)知道Python / Django和2)使用专用的IIS托pipe他的网站。
有人可以解释我怎么能解释我的托pipe服务提供商的过程,或者给我指点好的,详细的资源,我可以转发到我的托pipe服务提供商? 请记住,运行主机的人可能知道关于IIS的“一切”,但不知道如何处理Python。
如果你坚持使用IIS,尽可能使用PyISAPIe而不是CGI。 下面是PyISAPIe的说明和链接。 如果您的Web主机pipe理IIS而不是Python,那么您的Web主机将知道更多关于ISAPI扩展的知识,而且他们不需要通过PyISAPIe来了解Python。
更好的方式是使用PyISAPIe,ISAPI扩展 。 在IIS7上,PyISAPIe比CGI快得多。 这与Apache上的mod_python类似。 PyISAPIe项目主页提供了通过PyISAPIe使用WSGI设置Django的说明。 这将使公共/高stream量网站的性能达到合理的速度。
在IIS + Python中通过CGI环境设置Django对于任何生产使用来说都会非常慢。 您绝对不应该将其用于您希望每分钟处理less量请求的网站。 它也严格限制了你在Django的caching框架中可以caching的内容,因为Django应用程序的进程是在每个新的请求重新启动的。
在像Apache,lighttpd等这样的合理的web服务器中,使用mod_python,运行Django进程的Python解释器仍然保留在内存中,并且使用每个新的Apache工作线程来初始化,以处理很多请求。 这意味着Python + Django不会退出并重新启动每个新的请求。 在FastCGI设置中,Web服务器(例如Apache或Lighttpd)创build一个套接字(UNIX域或TCP),通过它与FastCGI应用程序(您的Django Web应用程序)通过FastCGI协议进行通信。 同样的HTTP代理设置(他们说HTTP而不是FastCGI)。 在CGI环境中,Python解释器被调用,它运行Django应用程序,对于每个请求都是重新执行的,所以应用程序无法保持内存中的请求状态,也无法在数据库中的任何地方正确caching。
足够的咆哮,如果你必须使用IIS + CGI + Django,下面是如何完成这个可怕的事情:使用下面的代码来创build自己的CGI脚本运行你的Django应用程序(它转换之间的CGI和WSGI)。 你将不得不编辑脚本,使其指向你的Django应用程序和代码。 这是您需要传递请求的CGI脚本。 接下来,您需要将所有请求转发/重写到您的CGI脚本中。
在IIS6下,你将需要一个类似于IISRewrite的mod_rewrite,我认为它不是免费的,而且是封闭源代码。 在IIS7下,微软终于包含了一个URL重写模块。 它的文档位于这里 。 在IIS7中创build重写规则的说明在这里 。 您需要将目标基本URL中的所有内容转发给您的CGI脚本。
如何在IIS上的FastCGI上设置Python
下面介绍如何在FastCGI IIS 7+上设置Python,为开启一个体面的DJango设置打开方式
…并且能够将debugging器挂接到进程中,使您可以逐步执行Python代码
本示例不使用IISpipe理控制台,而是列出生成的configuration文件的内容
安装Python +一个好的debugging器(这个例子使用WingIDE,我发现了一个很好的工具)这个例子假设文件夹为c:\ python27
创build一个web文件夹,例如在本地主机c:\ inetpub \ wwwroot \ mypythonfolder上,并把下面的web.config文件放在里面:
注意| pipe道字符在scriptProcessor指令中。 这由IIS用来将脚本映射到fastCgi应用程序(步骤3)。 它应该按照字符匹配来自下面的步骤3的全path+pipe道字符+参数设置。
在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中input以下代码:
import wingdbstub
在os.environ.keys()中为param导入os,io,sys ret =“environment:\ r \ n”: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()
确保IUSR有权写入您的c:\ temp文件夹
把wingdbstub.py和wingdebugpw放到你的c:\ python27 \ lib \ mylib \文件夹中。 这将启用翼边debugging。 这些文件随您的wing安装一起提供。 注意:如果Python还需要将你的代码编译到wingstub.pyc中,IUSR需要在这个文件夹上有写权限,因为python进程将在IIS下被启动
打开wingdb并在'import os,io,sys'行设置一个断点
点击浏览器http:// localhost / mypythonfolder
如果一切正常,翼现在应该被触发,以在您的断点显示运行代码。 如果没有: – 有防火墙问题。 python进程通过tcp连接与WingIDE接口进行通信 – 或者在wingide内部存在安全问题。 它需要wingdebugpw文件的正确版本,该文件基本上包含一个密码或令牌,用于validation对您的翼边安装的访问。 如果情况并非如此,任何有tcp访问你的电脑的人都可以对你的代码进行debugging。
确认在c:\ temp中创build了日志文件。 这也应该工作,如果你不能得到步骤7去
请注意,此页面会触发debugging器,但不会将任何页面返回到Web浏览器。 一些背景:networking服务器通过所谓的“logging”来传达fastcgi。 这意味着每个单一的用户请求进入您的应用程序包装在多个单独的“logging”。 每个logging都是一个数据结构,指示请求的开始,查询string,variables后置等。将这些logging解包为单个请求是麻烦的,它遵循http://www.fastcgi的fastcgi规范.COM /的devkit / DOC / FCGI-spec.html#S1
作为c:\ python27 \ lib \ mylib \ myfcgi.py的内容,我只是将其放在helicontech提供的zoofcgi.py的副本中。 这个python文件能够解码这些logging并提供一个页面,debugging非常有趣。 另外请注意,helicontech可以提供一个位于IIS和zoofcgi.py之间的DLL,但是这个DLL并不是必须的。 我相信它实现了msft提供的fastcgi实现的稍微改进和通用的版本。 但是,当你使用他们的DLL,当你想通过你的代码的过程是相当quicly终止和IIS /的DLL杀死你的Python进程时,总之没有响应回来秒或2。
而已。 原则上IIS和你的Python代码之间的通信是用命名pipe道完成的。 你应该能够使用tcp套接字来设置它,但是我无法确定哪个端口被使用(我相信stdin应该被转换成可以被select()编辑的端口,但是我没有给出任何尝试)
我还没有用Python做过这个,但是它和Perl的CGI一样工作得很好。 ActiveState的产品与IIS无缝集成。 ActivePerl获得了巨大的成功。 他们也有ActivePython可能(也许)也会在那里做的伎俩。 那么我想你只会下载Django 安装它 。
编辑:好的,所以划伤与IIS无缝集成…但是,这里是一篇关于如何集成到IIS的文章。 您也可以将Iron Python视为Windows的发行版。
对于提供者,我怀疑他们需要知道的不仅仅是像ASP / ASP.NET这样的Web开发平台,Python是用来开发它的语言。
就我上面提到的安装而言,我会尝试一下,看看它是如何运作的。 我会发布笔记,如果我得到它工作正常!