19.2 安装和配置mod_python
在这一部分,您将学习到如何安装和配置mod_python。当前Apache有两个流行的版本:1.3.x和2.0.x。对于1.3.x,您需要使用mod_python版本2.7,而对于Apache 2.0.x,您需要使用3.1或更高版本。本章中的指令和例子适用于mod_python 3.1和Apache 2.0。由于Apache 1.3.x到2.0.x,在内部结构上进行了较大的改动,本章的例子将不能运行在Apache 1.3.x服务器上。如果您可以选择的话,我建议使用Apache 2.0.x,因为当您要升级的时候,您将不必修改mod_python代码。
安装mod_python包含以下的4步:
1. 安装Python。
2. 安装Apache。
3. 安装mod_python。
4. 配置Apache来使用mod_python。
既然您正在学习一本关于Python的书,我假设您已经安装了Python。第二、三步会因为操作系统的不同而不同。有些操作系统提供商或第三方提供预编译的Apache和mod_python。如果您的供应商提供这些,那么安装这些预编译包就是最快、最简单地建立和运行mod_python的方法。
如果您自己安装,首先您需要获得并安装Apache 2.0。您可以从http://httpd.apache.org/ download.cgi下载。编译的时候,请确保带有动态共享对象(Dynamic Shared Objects,DSO)支
持。Apache大多数的安装都已经带有这个支持,但是有些严格定制或旧的Apache可能会没有。如果您是初次编译,需要把--enable-so传给Apache的配置脚本,这样就能激活DSO。
接下来,您需要取得并安装mod_python。您可以从http://httpd.apache.org/modules/python- download.cgi下载。您可以在下载的文件或www.modpython.org那里找到适合您使用平台的编译及安装说明书。安装的过程会因为Apache和mod_python版本的不同而有很大的不同,所以请检查您下载的文件或mod_python站点,确保您得到的是最新的说明书。
在全部安装之后,需要确保每个单独的部分都能正常工作。确定您知道如何使用Apache来提供静态HTML文件,并可以成功提供,还要知道如何修改这些文件。同时,需要确定您有一个可以工作的Python环境。稍后您在安装mod_python的时候,如果有问题,要确定Apache和Python是正常的。如果这两个部分都有问题,稍后就会引起mod_python问题。
您还要确定Apache的配置文件保存在哪里。通常的位置是/etc/apache、/etc/apache2、/etc/httpd、/usr/local/apache2、/usr/local/etc/httpd、/usr/local/etc/apache2或其他类似的位置。您还应该确定在配置目录下的首要Apache配置文件。一旦您已经确定了这些,就可以来配置mod_python了。
19.2.1 载入模块
为Apache服务器配置mod_python的第一件事情就是确定模块被载入了。这需要在您的Apache配置文件中有一行LoadModule代码。它看上去类似LoadModule python_module /path/to/mod_python.so。如果不知道路径,需要查看安装mod_python的输出,或者,如果您通过一个包来安装mod_python,您就需要咨询操作系统的提供者。有些操作系统会在Apache配置文件的mods-available directory区域提供例子。还有一些操作系统或许会允许您添加类似-D PYTHON to/etc/conf.d/apache2这样的内容来激活mod_python。
您应该可以通过指令apache2ctl restart或apachectl restart来重启Apache。如果重启成功,而您已经插入了这个LoadModule行,您就成功地把mod_python模块载入了Apache。
19.2.2 配置Apache目录
现在mod_python模块已经被激活,下一步是为Python程序启动它。mod_python模块只能被要求使用的区域和文件来启动。默认情况下,它对于任何区域都是不能使用的。
为了使您的代码可以被Apache看到,您需要做的第一件事情是把您的代码放在一个已经被Apache访问的目录中,或者是设置一个别名(Alias)。例如,您把mod_python放在/usr/local/mod_python下,您还可以配置如下的别名:
Alias /py /usr/local/mod_python
对于/py下文件的请求,实际上会使用/usr/local/mod_python下的代码。
现在您需要配置Apache来提供Python代码。下面是一个例子,您可以把它放在您的Apache配置文件中(或者是去掉第一行和最后一行的.htaccess文件)
<Directory /usr/local/mod_python>
AddHandler mod_python .prog
PythonHandler test
PythonDebug On
</Directory>
保存这个文件并在需要的时候调整目录名称,现在您就需要一个程序来测试一下,下面是一些您可以使用的代码。给它命名为test.py,并把它放在您的mod_python目录中,在这里是/usr/local/mod_python。请注意,和CGI脚本或独立的Python应用程序不同,在UNIX或Linux平台上,您不用设置这个文件为可运行。相反,Apache会直接把它引入一个运行着的Python解释器,代码如下:
# mod_python test example - Chapter 19 - test.py
from mod_python import apache
from sys import version
def writeinfo(req, name, value):
req.write("<DT>%s</DT><DD>%s</DD>\n" % (name, value))
def handler(req):
req.content_type = "text/html"
if req.header_only:
# Don't supply the body
return apache.OK
req.write("""<HTML><HEAD><TITLE>mod_python is working</TITLE>
</HEAD>
<BODY>
<H1>mod_python is working</H1>
You have successfully configured mod_python on your Apache system.
Here is some information about the environment and this request:
<P>
<DL>
""")
writeinfo(req, "Client IP", req.get_remote_host(apache.REMOTE_NOLOOKUP))
writeinfo(req, "URI", req.uri)
writeinfo(req, "Filename", req.filename)
writeinfo(req, "Canonical filename", req.canonical_filename)
writeinfo(req, "Path_info", req.path_info)
writeinfo(req, "Python version", version)
req.write("</DL></BODY></HTML>\n")
return apache.OK
保存这个文件,接着像本章前面介绍的那样停止并启动Apache服务器。
注意:使用mod_python的Apache服务器在修改了mod_python的配置后,有时不能正确地重启或载入。所以在改变mod_python的设置后,最好可以完全停止然后启动Apache。
现在您应该可以访问这个文档了。如果您使用/py作为mod_python目录的别名,您应该可以通过http://localhost/py/test.prog来访问这个文档。您将看到屏幕上显示一些信息,最上面是"mod_python is working"。在我的系统上,这个信息为:
mod_python is working
You have successfully configured mod_python on your Apache system. Here is
some information about the environment and this request:
Client IP
127.0.0.1
URI
/py/test.prog
Filename
/usr/local/mod_python/test.prog
Canonical filename
/usr/local/mod_python/test.prog
Path_info
Python version
2.3.3 (#1, Feb 24 2004, 09:29:13) [GCC 3.3.3 (Debian)]
您会发现这里的信息有些和您得到的CGI脚本的环境变量类似,而事实上您通过CGI得到的信息也可以从Apache API得到。
19.2.3 修复配置问题
如果您遇到了错误,在处理本章后面介绍的例子之前,您需要修复Apache的配置。Apache的错误日志通常包含提示,可以帮您解决问题。这个错误日志通常名为error.log或error_log,尽管因为系统的不同,错误日志保存的位置也不同,但是它一般保存在/var/log/apache、/var/log/httpd或/var/log/apache2。
如果您还是有问题,下面这些提示也许能帮上忙:
l 如果启动Apache失败(或您用浏览器访问,得到“连接拒绝”(Connection refused错误),那估计是您的配置文件有问题。检查mod_python模块是否被正确载入,以及有没有拼写错误。apache2ctl configtest或apachectl configtest指令可以帮助查找问题。
l 如果Apache启动了,但是却产生了一个"4xx"错误(例如:“找不到页面”或“权限”问题),请确定您指定了别名,并指向了合适的目录。还要确定该目录给Apache服务器设置了访问权限。如果您使用的是.htaccess文件,需要确定Apache配置为使用它们,并从它们所在的目录提供文件。
l 如果您得到一个内部服务器错误(internal server error),请确定您的例子是正确的,且配置文件是正确的。接着您可以从错误日志中查看原因。
l 如果您没有看到HTML输出,而是Python代码,请检查配置文件中的目录部分。确保路径没有写错,而且提供了所有需要的行。
l 试着停止Apache,等候1分钟,然后重新启动。看看能不能解决问题。
如果您还是不能解决您的问题,那就请查看www.modpython.org上相关的文档和FAQ。您也可以在comp.lang.python新闻组或mod_python邮件列表中寻找帮助,mod_python邮件列表的地址是http://mailman.modpython.org/mailman/listinfo/mod_python。







