步骤1

步骤1

由于我无法控制的原因,我们的网站托管在一家使用 IIS 作为服务器的托管提供商处。他们目前提供 PHP 和 ASP,以及通过 cgi 脚本提供的 Python 和 Perl。

我想重新设计、重写我们的网站,并希望从 PHP 更改为 Python/Django 设置。托管服务提供商愿意听取建议,但他们明确表示“我们真的不知道 Python 是什么,也不知道它是如何工作的,但如果你能向我们解释一下,我们会尽力满足你的任何需求”。

但是,我可能知道如何在 apache/mod_python 上的共享托管环境中设置 Django,但我不知道如何在 IIS 上设置它,当然也不知道如何在共享托管环境中设置它。我在 Google 上搜索了一下,但我找到的大多数资源都假设系统管理员 1) 了解 Python/Django 并且 2) 正在为其网站使用专用 IIS 托管。

有人能解释一下我该如何向托管服务提供商解释这个过程吗?或者给我一些好的详细资源,让我可以转发给我的托管服务提供商吗?请记住,托管人员可能知道有关 IIS 的“一切”,但不知道如何处理 Python。

答案1

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

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

通过 CGI 环境在 IIS+Python 中设置 Django 对于任何生产用途来说都会非常慢。您永远不应该将此用于您预计每分钟处理超过几个请求的网站。它还严重限制了您可以在 Django 的缓存框架中缓存的内容,因为 Django 应用程序的进程会随着每个新请求而重新启动。

在 Apache、lighttpd 等使用 mod_python 的健全的 Web 服务器中,运行 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 下,您需要一个 mod_rewrite 等效模块,如 IISRewrite,我认为它不是免费的,而且是闭源的。在 IIS7 下,微软终于包含了一个 URL 重写模块。它的文档位于这里。在 IIS7 中创建重写规则的说明如下这里。您将需要转发目标基本 URL 处的所有内容,以便由您的 CGI 脚本处理。

答案2

如何在 IIS 上的 FastCGI 上设置 Python

以下是如何在 FastCGI IIS 7+ 上设置 Python,为良好的 DJango 设置铺平道路

...并能够将调试器挂接到进程中,使您能够逐步执行 Python 代码

此示例不使用 IIS 管理控制台,但列出了生成的配置文件的内容

步骤1

安装 Python + 一个好的调试器(此示例使用 WingIDE,我发现它是一个很好的工具)此示例假设文件夹为 c:\python27

第2步

创建一个 Web 文件夹,例如在本地主机 c:\inetpub\wwwroot\mypythonfolder 上,并将以下 web.config 文件放入其中:

请注意 scriptProcessor 指令中的 | 管道字符。IIS 使用它来将脚本映射到 fastCgi 应用程序(步骤 3)。它应该逐个字符地匹配下面步骤 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>

步骤4

在 c:\python27\lib\mylib\myfcgi.py 中输入以下代码:

import wingdbstub

导入操作系统、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/mypython文件夹

如果一切正常,wingide 现在应该被触发以显示断点处的运行代码。如果没有:- 要么是防火墙问题。python 进程通过 tcp 连接与 WingIDE 接口通信 - 要么是 wingide 内部存在安全性问题。它需要正确版本的 wingdebugpw 文件,该文件基本上包含一个密码或令牌,用于验证对您的 wingide 安装的访问权限。如果不是这种情况,任何对您的 PC 具有 tcp 访问权限的人都可以针对您的代码进行调试。

步骤8

验证 c:\temp 中是否创建了日志文件。如果无法执行第 7 步,此方法也有效

步骤9

请注意,此页面会触发调试器,但不会向 Web 浏览器返回任何页面。一些背景知识:Web 服务器通过所谓的“记录”与 FastCGI 进行通信。这意味着每个单独的用户请求都会打包成多个单独的“记录”进入您的应用程序。每条记录都是一个数据结构,指示请求的开始、查询字符串、发布变量等。将这些记录解包为单个请求有点麻烦,它遵循 FastCGI 规范 http://www.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 断定在一两秒内没有响应时,它会终止您的 python 进程。

就是这样。原则上,IIS 和 Python 代码之间的通信是通过命名管道完成的。您应该能够使用 tcp 套接字进行设置,但我无法弄清楚使用了哪个端口(我相信 stdin 应该转换为可以 select() 的端口,但我没有尝试这样做)

答案3

我还没有用 Python 尝试过这个,但是它作为 Perl 的 CGI 运行得很好。 ActiveState 的产品与 IIS 无缝集成。我使用 ActivePerl 取得了巨大成功。他们还活动Python这可能(可能)也能解决问题。那么我认为你只需要下载 Django安装它

编辑: 好的,那么放弃与 IIS 的无缝集成吧...不过,这里有一篇关于如何集成到 IIS. 你也可以考虑铁蟒作为 Windows 系统的发行版。

对于提供商,我认为他们需要了解的不仅仅是 ASP / ASP.NET 之类的 Web 开发平台,而且 Python 是用于开发的语言。

至于我上面提到的安装,我将尝试一下,看看效果如何。如果安装成功,我会发布相关说明!

相关内容