如何解释将Django / Python安装到运行共享IIS服务器的Python新手[关闭]


9

由于超出我控制范围的原因,我们的网站由使用IIS作为其服务器的托管提供商托管。他们目前通过cgi-scripts提供PHP和ASP,以及Python和Perl。

我想进行重新设计,重新编写我们的网站,并希望从PHP更改为Python / Django设置。托管服务提供商愿意征求建议,但很明确地说:“我们并不真正了解Python是什么,也不知道它是如何工作的,但是如果您可以向我们解释它,我们将尝试为您提供所需的一切” 。

但是,我可能知道如何在apache / mod_python上的共享托管环境中设置Django,但是我不知道如何在IIS上进行设置,当然也不知道如何为共享托管环境进行设置。我已经用Google搜索了一下,但是我发现的大多数资源都假定sysadmin 1)知道Python / Django,2)正在为其站点使用专用的IIS托管。

有人可以向我的托管服务提供商解释如何解释该过程,或者为我提供可以转发给托管服务提供商的详细详细资源的指示吗?请记住,托管主机的人员可能对IIS了解“一切”,但不知道如何处理Python。

Answers:


8

如果您坚持使用IIS,请尽可能使用PyISAPIe而不是CGI。以下是PyISAPIe的说明和链接。如果您的Web托管者管理IIS,则他们对ISAPI扩展的了解要比对Python了解得多,并且他们对PyISAPIe的Python不需要了解太多。

这样做的一种更好的方式是使用ISAPI扩展PyISAPIe。PyISAPIe比IIS7上的CGI快得多。它的作用类似于Apache上的mod_python。PyISAPIe项目主页上有关于在PyISAPIe上使用WSGI设置Django的说明。对于公共/高流量网站,这将使您的性能达到合理的速度。

对于任何生产用途,通过CGI环境在IIS + Python中设置Django都将非常缓慢。您切勿将其用于期望每分钟提供少量请求的网站。这也会严重限制您可以在Django缓存框架中的内存中缓存的内容,因为Django应用程序的进程会随着每个新请求而重新启动。

在使用mod_python的健全的Web服务器(如Apache,lighttpd等)中,运行Django进程的Python解释器仍保留在内存中,并使用每个新的Apache辅助线程进行初始化,该线程在一段时间内处理许多请求。这意味着对于每个新请求,不会退出并重新启动Python + Django。在FastCGI设置中,Web服务器(例如Apache或lighttpd)创建一个套接字(UNIX域或TCP),通过该套接字,它通过FastCGI协议与FastCGI应用程序(您的Django Web应用程序)进行通信。同上,用于HTTP代理设置(他们说的是HTTP而不是FastCGI)。在CGI环境中,将调用Python解释器,该解释器将运行Django应用程序,对于每个请求都是全新的,因此该应用程序无法在内存中保持各个请求的状态,并且无法在数据库中的任何位置正确缓存。

如果您必须使用IIS + CGI + Django,那么足够了,这是完成此可怕事件的方法:使用以下代码创建您自己的CGI脚本,该脚本运行Django应用程序(在CGI和WSGI之间转换)。您必须稍微编辑一下脚本,使其指向您的Django应用程序和代码。那就是您需要将请求传递到的CGI脚本。接下来,您需要将所有请求转发/重写到您的CGI脚本...

在IIS6下,您将需要一个与IISRewrite类似的mod_rewrite等效项,我认为它不是免费的,并且是封闭源代码。在IIS7下,Microsoft最终包括了URL重写模块。它的文档位于此处。在IIS7中创建重写规则的说明在此处。您将要在目标基本URL处转发所有内容,以由CGI脚本处理。


由于托管是共享的,所以主要的问题是托管提供商将如何配置PyISAPIe来满足我的需求以及其他客户的不同需求。我在主页上找不到使用WSGI设置Django的说明...如果其他所有方法均失败,我将仅使用CGI方法。每周只有不到400个请求,我认为我们可以使用CGI解决方案,直到我们决定切换托管。
Epcylon

1

如何在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()的端口,但是我没有给出任何尝试)


0

我没有在Python上尝试过,但是在Perl上作为CGI很好用。 ActiveState的产品与IIS无缝集成。我在ActivePerl上取得了巨大的成功。他们也有ActivePython,可能(可能)在那里也能解决问题。然后我认为您只需下载Django 安装它即可

编辑: 好的,所以请抓紧与IIS的无缝集成...但是,这是有关如何集成到IIS的文章。您可能还将Iron Python作为Windows发行版。

对于提供者,我会怀疑他们需要了解的不仅是像ASP / ASP.NET这样的Web开发平台,而且Python是用于与其一起开发的语言。

至于我在上面提到的安装,我将尝试一下并观察其效果。如果可以,我会在上面贴上笔记!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.