在Apache中使用Mod_python模块

mod_python是apache组织的一个项目,通过它,可以开发psp或cgi,mod_python功能强大,速度快,是非常优秀的web开发工具。

性能

mod_python的一个最主要优点就是在性能上超越传统CGI。下面是一个非常粗略的测试。该测试是在一台运行Red Hat Linux 7.3的奔腾1.2G的机器上完成的。 用来对4种脚本进行测试,所有的都是从标准cgi模块输入(因为这是一个典型Python cgi脚本开始的方式), 然后输出一个简单的单词"Hello!"。这个结果是基于10000次并发为1的请求。

    Standard CGI:               23 requests/s
Mod_python cgihandler: 385 requests/s
Mod_python publisher: 476 requests/s
Mod_python handler: 1203 requests/s


可移植性
apache是按照阶段处理请求的(比如:读取请求、处理请求头、检查存取等)。这些阶段可以分别用处理器调用的函数来实现。传统上,使用C语言编写处理器模块。
mod_python
提供了使用Python拜你些apache处理器扩展apache功能的方法。

为了方便的从
CGI移植,标准的mod_python处理器提供了CGI模拟环境,允许用户不修改遗留下来的脚本,而在大多数时候无需进行任何修改。
历史

mod_python起源于Httpdapy项目(1997)。很久以后Httpdapy才被叫做mod_python,因为Httpdapy并不是特定用于apache服务器的。Httpdapy设计成跨平台的,而实际上主要从Netscape服务器开始(追溯到1997年的Nsapy)

这个Httpdapy的README文件的摘要,很好的阐述了在HTTP server中嵌入Python所带来的挑战和解决方案。

在我多年前开发第一个WEB应用程序时就发现CGI访问数据库非常慢,因为每次点击请求都会装入解释器并执行数MB的数据。数据库往往都很大,并将大量时间浪费在数据库的连接/认证等"意义重大"的事情上,像DNS查询、编码与解码、内存分配等等。在应用提速的压力下,我尝试过使用Python和多种工具的综合使用。我并不迷信微软的ASP,又被Netscape的性能和满是臭虫而郁闷。"Cold Fusion"(冷聚变)看起来有希望,但我稍后学会了HTML类标签的书写方式,可读性跟汇编有一拼。比如PHP。但是我真的很想用Python来写东西。

就在同时有关Python互联网编程的书籍出版了,其中将Python嵌入到Netscape服务器的方式立即引起了我的注意。我在我的项目中使用了这个例子,并在稍后开发了我自己的改进版,叫做Nsapy,并在WindowsNTSolaris上编译。

尽管Nsapy仅能工作在Netscape服务器上,但是出于灵活通用的面向对象设计,在Python精灵中,很容易移植到其他的WEB服务器。

后来,曾经流行的Netscape服务器挂了,我就将Nsapy移植到最流行的服务器apache上。所以从Nsapy衍生出了Httpdapy

继续这个传奇,你会想到将Httpdapy移植到其他服务器上,实际上他们比预想要复杂而且枯燥。

反之,提供一个类似于Perl语言的apache扩展mod_perl一样或更好性能的部件会更有意思。

俱往矣,mod_python的第一个版本发布于20005月。

 

安装

先决条件

Python 2.2.1或更新的版本
apache 2.0.40
或更新的版本,如果要使用apache 1.3.x,请使用mod_python的版本2.7.x

编译mod_python需要有apachePython的包含文件,并且确保安装了Python标准库。如果你从源代码安装了Pythonapache,那么你已经拥有了这些了。如果你使用了预打包软件,如RPM或其他方式则只有二进制版本,而没有源码。通常apachePython的包含文件和库文件在各自的"development"包中。如果你不确定拥有这些重要文件,请从源码安装Pythonapache,或者阅读你系统的文档以了解如何获得开发包。

编译

有两种链接apache模块的方式:静态的和DSO方式。

DSO方式现在非常流行,并推荐用于mod_python的安装。模块被编译成共享库,并在运行时动态装入。

DSO方式的优势在于安装模块时无需重新编译apache。关于DSO机制的详细信息参见http://httpd.apache.org/docs-2.0/dso.html

当前版本的mod_python仅支持DSO方式。

静态链接是一种较老的方式,比动态连接的方式支持更多的平台,但是较少使用。主要的缺陷是必须要重新编译apache,在很多情况下并不是一个好的选择。


运行./configure

./configure脚本将会分析你的运行环境,并创建自定义的Make文件用于你的系统。使用autoconf生成的./configure包含如下内容:

$ ./configure --with-apxs=/usr/local/apache/bin/apxs

强烈建议使用这个选项。

$ ./configure --with-python=/usr/local/bin/python2.3

$ ./configure --with-max-locks=32

这个选项是在3.2.0版本开始提供的。

$ ./configure --with-flex=/usr/local/bin/flex

这是3.2.0版本中的新特性

$ ./configure --with-python-src=/usr/src/python2.3

这个是3.2.0版本中的新特性

2.2.2运行make

开始构建过程,简单的运行如下即可:

$ make


2.3安装

2.3.1运行make install

这个安装过程必须在root用户下完成:

$ su

# make install

这将会简单的将二进制版本复制到apachelibexec目录。

并且会安装python-librariessite-packages并编译他们。

如果你想只安装python库或者只安装DSO,可以用如下make目标:

# make install_py_lib

# make install_dso

2.3.2配置apache

按照DSO模式安装的apache,需要在httpd.conf中加入启动mod_python的句子:

LoadModule python_module libexec/mod_python.so

实际的mod_python.so路径可能有所变化,但是make install将会显示这个文件的确切路径。


2.4测试

注意次部分内容仅适用于3.x版本,如果使用2.7.x版本,你需要找到更适合的文档。

<Directory /APACHEHOME/htdocs/test>

AddHandler mod_python .py

PythonHandler mptest

PythonDebug On

</Directory>

from mod_python import apache

def handler(req):

req.content_type='text/plain'

req.write("Hello, world!")

return apache.OK

参考:

http://home.comcast.net/d.popowich/mpservlets

http://www.dscpl.com.au/projects/vampire


2.5故障处理

如果出现问题,可以按照如下的处理:

$ ./httpd -X

这样将会显示更多有用信息

<Location /mpinfo>

SetHandler mod_python

PythonHandler mod_python.testhandler

</Location>

这时指向你的/mpinfoURL则会显示一些信息帮助处理mod_python的问题。

mod_python版本

操作系统类型、名字、版本号

Python版本、非常规的编辑选项

apache服务器版本

相关的apache配置,.htaccess

相关的Python代码


完成...




第三章 指南

3.1使用发布器(Publisher)的快速例子

这一节提供无需太多细节的发布器指南。更多如何使用mod_python处理器的细节将在以后解释。

发布器(publisher)提供了发布mod_python标准模块的方式。需要在配置文件中加入如下配置:

AddHandler mod_python .py

PythonHandler mod_python.publisher

PythonDebug On

下例会返回简单的表单数据。询问姓名、电子邮件、注释之后将会给管理员发邮件。这个简单的应用程序由两个文件组成:form.html用于提交数据,form.py用于处理表单动作。

如下是表单:

<html>

Please provide feedback below:

<p>

<form action="form.py/email" method="POST">

Name: <input type="text" name="name"><br>

Email: <input type="text" name="email"><br>

Comment: <textarea name="comment" rows=4 cols=20></textarea><br>

<input type="submit">

</form>

</html>

注意表单的action属性指向form.py/email调用,如下创建form.py,如下:

import smtplib

WEBMASTER="webmaster" #管理员电邮

SMTP_SERVER="localhost" #本机SMTP服务器

def email(req,name,email,comment):

#一定要确保用户提供了所有的参数

if not(name and email and comment):

return "缺少必要的参数"

#创建消息文本

msg=""" \

From: %s

Subject: feedback

To: %s

I have the following comment:

%s

Thank You,

%s

""" % (email,WEBMASTER,comment,name)

#发送信息

conn=smtplib.SMTP(SMTP_SERVER)

conn.sendmail(email,[WEBMASTER],msg)

conn.quit()

#提供返回页面

s="""\

<html>

Dear %s,<br>

Thank you for your kind comments, we

will get back to you shortly.

</html>""" % name

return name

当用户点击提交按钮时,发布器将会装入email函数到form模块,传递表单字段作为关键字参数。也会传递请求对象到req

注意逆必须要有req参数。发布器已经可以很聪明的传递必要的参数。函数的返回值将被发送到客户端浏览器。

即使使用发布器可以非常简单的处理,但是程序仍然可以利用mod_python的强大功能,比如调用请求对象。当然也可以调用本地的mod_python处理器来完成大量的工作。比如设置HTML头路由req.headers_out;返回错误抛出apache.SERVER_ERROR异常;从客户端的重定向读写文件req.write()req.read(),等等。

阅读6.1节了解更多关于发布器的详细信息。


3.2apache处理器概览

节标题翻译有误,应为"快速学习apache如何处理请求"

如果你想要深入钻研mod_python的功能,需要理解什么是处理器。

apache分阶段(phase)处理请求。比如第一个阶段是用户认证,之后是检验用户是否有权访问特定的文件,然后是读取文件并发送到客户端。一个典型的静态文件请求包含三个阶段:1.翻译URI到文件位置2.读取文件并发送到客户端3.记录请求日志。更复杂的处理依赖于配置文件。

一个处理器就是初始处理某个阶段的函数。同一个阶段可以有多于一个处理器进行处理,被叫做apache序列。对应每个阶段有个缺省的apache处理器(大多数只做缺省动作或者什么都不作)。然后由其他的apache模块提供处理器,比如mod_python

mod_python提供了apache每一个重要的处理器。mod_python处理器缺省时不会做任何事情,除非用特定的配置文件标志。这些标志以"Python"开始并以"Handler"结尾(如:PythonAuthenHandler),指定Python函数来处理指定的阶段。所以mod_python的主函数只是作为发报机的角色连接apache处理器和Python函数。

最常用的处理器是PythonHandler。它处理含有上下文的请求。因为它没有名字,所以有时也成为通用处理器。这个处理器的apache缺省行为是读取文件并发送到客户端。大多数应用应该重写这个处理器。


3.3mod_python做了什么

我们假设有如下配置:

<Directory /mywebdir>

AddHandler mod_python .py

PythonHandler myscript

PythonDebug On

</Directory>

所以还需要一个如下文件,'/mywebdir/myscript.py'如下:

from mod_python import apache

def handler(req):

req.content_type="text/plain"

req.write("Hello World!")

return apache.OK

如下的事情将会发生:AddHandler标志告诉apache所有的以.py结尾的'/mywebdir'下或其子目录下的文件请求都由mod_python负责处理。'PythonHandler myscript'标志告诉mod_python通用处理器在myscript脚本。'PythonDebug On'标志告诉mod_python如果发生错误,则把错误信息输出到客户端,便于开发。

当请求到来时,apache开始分步骤处理请求并讲请求发送到mod_pythonmod_python处理器检查配置获取处理器。在本例,我们除了通用处理器之外没有调用其他东西。当读取配置到'PythonHandler myscript'时,会发生下面的事情:

1.如果没有做过,假设预设目录已经存在于sys.path中。

2.尝试按名字导入模块myscript。注意子目录是不在sys.path中的,如果需要只能按照包名的方式调用。

3.myscript中查找函数handler

4.调用这个函数并传递请求对象(关于请求对象的更多东西在后面)

5.在这里我们细致研究一下脚本:

from mod_python import apache

导入apache模块来获取apache的接口。大多数mod_python程序需要有这一行。

def handler(req):

这是处理器函数的声明。叫做'handler'是因为mod_python按照配置标志寻找函数。将配置标志转换成小写,然后去掉'python'即可。这样'PythonHandler'就成了'handler'。当然也可以用其他的名字,但是需

作者:gashero(译)   更新日期:2006-08-25
来源:http://blog.csdn.net/gashero   浏览次数:

相关文章

相关评论   发表评论

  • No Comments