声明:此篇文章的内容由https://github.com/GrahamDumpleton/mod_wsgi/blob/master/win32/README.rst
翻译而来。
文章中说明了如何在windows下正确的使用mod_wsgi,请耐心查看,相信大家一定会有所收获。
在Windows上运行Apache/mod_wsgi会有点难搞。
如下四点要求需要严格满足才行:
各python版本所使用的Microsoft C/C++编译器版本如下所示:
这就意味着如果你是使用Python2.6或者2.7,你应该选择一个用Microsoft VC9 C/C++编译器编译的Apache;同样的,如果你是使用Python3.3或者3.4,你应该选择一个用Microsoft VC10 C/C++编译器编译的Apache。
如果你不管上面提到的需求而非要用一个用Microsoft VC11 C/C++编译器编译的Apache,那可不能保证它能正常工作,也许Apache可能会启动失败或者在处理请求的时候崩溃。
同样的你如果是使用用Microsoft VC9 C/C++ 编译器编译的Python2.6或者Python2.7,而你却用Microsoft VC10 C/C++编译器编译的Apache2.4,你也会遇到一些问题。(译者注:由于我使用的版本不对,在这里我表示被坑了大半天,因为这个问题,我启动Apache加载mod_wsgi的时候一直提示“找不到指定模块”,那么多的模块在同一文件夹里面,Apache唯独不认识他…网上虽然有很多使用Apache和mod_wsgi的博文,但是都没有提到过这个问题)
这个问题是因为Apache Lounge的Apache代码到VC9这一点已经不再使用了(译者注:这句话没有理解作者的意思,翻译有误),他们已经停止发布可用的用VC9编译器的编译的Apache版本。这就意味着如果你以前没有下载这个Win32 VC9版本的Apache的话,在技术上来说你现在不能在装有Python2.6和Python2.7的Windows上正常使用mod_wsgi,因为你不能获取到正确版本的Apache。
通过查看下面的进一步解释,关于在运行Python2.6或者Python2.7的情况下使用一个Win64 VC10编译的Apache时的某种可能的情形。将会让你明白,Apache在前面的情况下是不能保证正常工作的。
有时,预编译的代码可能支持mod_wsgi。但是这不会在每个release版本中更新,因为往往mod_wsgi的代码只是因为mod_wsgi守护进程模式或者mod_wsgi-express而做的更改,他们没有一个是支持Windows的。
如果事先编译好的mod_wsgi代码有生成好可用的,将会放在mod_wsgi工程下的github release页面中提供下载:
如果大部分的新版本没有与之相关的,请查找以前的旧release版本。
这些mod_wsgi代码将会按照Python软件基金会(PSF)网站提供的各版本的Python进行编译生成对应的版本:
这些mod_wsgi二进制包通常只适用于Apache Lounge的二进制包,并且不应该和其他任何Apache binary distribution一起使用。
目前的mod_wsgi二进制包如下所示:
名称中包含Apache22-win32-VC9
的版本应该使用Apache 2.2 Win32 VC9版本的Apache。Alas Apache Lounge已经不再提供这样版本的Apache支持和下载,如果你已经没有用Win32 VC9编译器编译的旧版本Apache的话,那就不好意思了。
名称中包含Apache24-win32-VC10
的版本应该使用Apache 2.4 Win32 VC10版本的Apache,这里可以下载:
名称中包含Apache24-win64-VC10
的版本应该使用Apache 2.4 Win64 VC10版本的Apache,这里可以下载:
你会发现Apache Lounge不再为Apache发布任何Win64 VC9的代码了,这就意味着从技术上来讲现在已经没有可用的组合,在使用Win64 VC9版本的Python2.6或者Python2.7的情况下正确运行mod_wsgi了。
但是,长时间以来显示使用者纯粹不想接受这样的情况,并且也不想理解为什么一旦混淆了VC9和VC10的二进制包的时候是不能保证mod_wsgi能够正常工作的。(译者注:我想是很多人不懂才会不想理解)
这个特殊的问题的是指一旦一个确定的数据结构在VC9和VC10的代码之间传递,那么应用程序会因为每个变量的数据结构布局可能不能被兼容而崩溃。
由于这个问题是发生在Apache和Python经过mod_wsgi的接口上,并且出现的概率很低,所以这里没有实例来演示不兼容的数据结构经过ABI边界的情形,但是低概率事件可不能保证它不会发生啊。
所以,由于Apache Lounge不再支持发布任何VC9版本的Apache了,但是下面这些宝石还是依然提供的。因为它们是使用不同ABIs的混合的版本,所以它们可能在你的特殊环境下没法运行。不过依然欢迎你去尝试,只是这里不能提供给你帮助去使用这些组合:
你也注意到了,这里没有提供适合Python3.2的包,因为这个Python版本是Python3.x版本中的很老旧的版本,并且由于它是一个Win64 VC9的Python版本,当它和Win64 VC10版本的Apache2.4一起使用的时候,Apache启动的时候就会崩溃。所以当你使用混合的版本组合去构建环境去适应不同的ABIs是多么的任性。所以我现在警告你。
如果你想要编译源代码是因为你使用了不同的Apache distribution或者一个不同的Python distribution,你需要安装相应的Microsoft C/C++编译器。而不是简简单单随意使用你现有的编译器。
下面将会详细描述哪里可以获取可用的Microsoft C/C++编译器。
使用PSF提供的最新的Python2.6或Python2.7的代码:
你必须使用32位版本的,名字中有如下标签:
Python 2.6 和 2.7是使用 Visual Studio 2008的编译器编译的,这是指编译成VC9。
你必须因此而是用一个VC9的Apache。
至于编译器,你需要在这里下载:
这个编译器可以编译32位和64位的代码。
使用PSF提供的最新的Python2.6或Python2.7的代码:
你必须使用64位版本的,名字中有如下标签:
Python 2.6 和 2.7是使用 Visual Studio 2008的编译器编译的,这是指编译成VC9。
你必须因此而是用一个VC9的Apache。
至于编译器,你需要从微软下载,链接如下:
这个编译器可以编译32位和64位的代码。
使用PSF提供的最新的Python3.3或Python3.4的代码:
你必须使用32位版本的,名字中有如下标签:
Python 3.3 和 3.4 是使用 Visual Studio 2010的编译器编译的,这是指编译成VC10。
你必须因此而使用一个VC10的Apache。
至于编译器,你需要从微软下载,链接如下:
使用这样一个文件:
这个编译器只能编译32位的代码。
使用PSF提供的最新的Python3.3或Python3.4的代码:
你必须使用64位版本的,名字中有如下标签:
Python 3.3 和 3.4 是使用 Visual Studio 2010的编译器编译的,这是指编译成VC10。
你必须因此而是用一个VC10的Apache。
至于编译器,你需要从微软下载,链接如下:
这个编译器和上面那个只能编译32位的 Visual C++ 2010 Express不同,它是用来编译64位的。
当Python,Apache和合适的 Microsoft C/C++都已经安装好了,启动 Visual Studio 2008/2010 或者 Windows 7.1 命令提示符窗口去和适合你Python版本的 Microsoft C/C++ 编译器保持通信。进入到源代码文件目录,然后你需要这样做:
nmake -f apXYpyXY-winNN-VC?.mk clean
替换前面命令中的’XY’为你目前使用的Apache和Python版本号;替换’NN’为’32’或’64’;替换’?’为’9’或’10’。nmake -f apXYpyXY-winNN-VC?.mk
, 这个命令将会构建mod_wsgi。nmake -f apXYpyXY-winNN-VC?.mk install
,这个命令将会安装mod_wsgi模块到你的Apache模块目录下。LoadModule
行(译者注:用于加载模块的一条语句)到Apache配置文件中。其它构建脚本也有在目录中,但是它们允许批量编译所有的组合,所以一般不常使用。因为它们需要所有可能的Apache和Python版本都是有效的,同样他们所对应的 Microsoft C/C++ 编译器也需要满足。所以你应该选择你需要的makefile。