由于我无法控制的原因,我们的网站由使用 IIS 作为其服务器的托管服务提供商托管。他们目前通过 cgi 脚本提供 PHP 和 ASP,以及 Python 和 Perl。
我想重新设计,重新编写我们的网站,并希望从 PHP 更改为 Python/Django 设置。托管服务提供商愿意提供建议,但明确表示“我们并不真正知道 Python 是什么,也不知道它是如何工作的,但如果你能向我们解释一下,我们会尽力为你提供任何你需要的东西” .
但是,我可能知道如何在 apache/mod_python 上的共享托管环境中设置 Django,但我不知道如何在 IIS 上设置它,当然也不知道如何为共享托管环境设置它。我用谷歌搜索了一下,但我发现的大多数资源都假设系统管理员 1)知道 Python/Django 和 2)正在为他的网站使用专用的 IIS 托管。
有人可以解释我如何向我的托管服务提供商解释这个过程,或者给我一些可以转发给我的托管服务提供商的好的、详细的资源吗?请记住,运行主机的人可能知道有关 IIS 的“一切”,但不知道如何处理 Python。
如果您坚持使用 IIS,请尽可能使用 PyISAPIe 而不是 CGI。PyISAPIe 的说明和链接如下。如果您的 Web 主机管理 IIS,那么他们对 ISAPI 扩展的了解要比对 Python 的多得多,而且他们不需要对带有 PyISAPIe 的 Python 了解太多。
一个更好的方法是使用 PyISAPIe,一个 ISAPI 扩展。PyISAPIe 比 IIS7 上的 CGI 快得多。这与 Apache 上的 mod_python 类似。PyISAPIe 项目主页有使用 WSGI over PyISAPIe 设置 Django 的说明。这将使您的性能达到公共/高流量网站的合理速度。
通过 CGI 环境在 IIS+Python 中设置 Django 对于任何生产用途来说都会非常缓慢。您永远不应该将它用于您希望每分钟处理多个请求的网站。它还严重限制了您可以在 Django 的缓存框架中缓存在内存中的内容,因为 Django 应用程序的进程会随着每个新请求而重新启动。
在像 Apache、lighttpd 等健全的 Web 服务器中,使用 mod_python,运行 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 下,微软终于包含了一个 URL 重写模块。它的文档位于此处。在 IIS7 中创建重写规则的说明在这里。您将希望在目标基本 URL 处转发所有内容,以由您的 CGI 脚本处理。
如何在 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 中的完整路径 + 管道字符 + 参数设置。
第 3 步
在 c:\windows\system32\inetsrc\config 文件夹中的 applicationHost.config 文件中,将以下内容放在该部分中:
第4步
在 c:\python27\lib\mylib\myfcgi.py 中放入以下代码:
import os, io, sys ret = "environment:\r\n" for param in 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) 句柄.close()
第 5 步
确保 IUSR 有权写入您的 c:\temp 文件夹
第 6 步
将wingdbstub.py 和wingdebugpw 放入您的c:\python27\lib\mylib\ 文件夹。这将启用wingide中的调试。这些文件随您的机翼安装一起提供。注意:如果 Python 还需要将您的代码编译成wingstub.pyc,则IUSR 需要对该文件夹的写入权限,因为IIS 将在该帐户下启动python 进程
第 6 步
打开wingdb并在'import os, io, sys'行设置断点
第 7 步
在浏览器中点击http://localhost/mypythonfolder
如果一切正常,wingide 现在应该被触发以在断点处显示正在运行的代码。如果不是: - 要么是防火墙问题。python 进程通过 tcp 连接与 WingIDE 接口进行通信 - 或者wingide 中存在安全问题。它需要正确版本的wingdebugpw 文件,该文件基本上包含一个密码或令牌,用于验证对您的wingide 安装的访问。如果不是这种情况,任何对你的电脑有 tcp 访问权限的人都可以调试你的代码。
第 8 步
验证是否在 c:\temp 中创建了日志文件。如果您无法进行第 7 步,这也应该有效
第 9 步
请注意,此页面会触发调试器,但不会将任何页面返回给网络浏览器。一些背景知识:网络服务器通过所谓的“记录”与 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 套接字进行设置,但我无法弄清楚使用了哪个端口(我相信标准输入应该转换为端口,然后可以使用 select() 编辑但我没有给出那个任何尝试)
我没有用 Python 尝试过这个,但它作为 Perl 的 CGI 效果很好。 ActiveState 的产品与 IIS 无缝集成。我在 ActivePerl 上取得了巨大的成功。他们也有ActivePython,它可能(可能)也会在那里解决问题。然后我想你只需下载 Django安装它。
编辑: 好的,所以从头开始与 IIS 的无缝集成......但是,这是一篇关于如何集成到 IIS的文章。您也可以考虑将Iron Python作为 Windows 机器的发行版。
对于提供商,我怀疑他们需要知道的不仅仅是它是一个像 ASP / ASP.NET 这样的 Web 开发平台,而 Python 是用来开发它的语言。
至于我上面提到的安装,我会尝试一下,看看效果如何。如果我能正常工作,我会在上面发布注释!