第一章 簡介
1.1性能
使用mod_python的主要優勢在於比傳統CGI更高的性能。一個測試,使用在Pentium 1.2GHz的機器上運行Red Hat Linux 7.3。使用4種類型的腳本,基於標准的CGI導入模塊(以典型的Python CGI腳本開始),然後輸出'Hello!',測試10000次請求作為基准。
標准CGI: 23 次請求/秒
mod_python CGI處理器: 385 次請求/秒
mod_python 發布處理器: 476 次請求/秒
mod_python 處理器: 1203 次請求/秒
1.2可移植性
apache是按照階段處理請求的(比如:讀取請求、處理請求頭、檢查存取等)。這些階段可以分別用處理器調用的函數來實現。傳統上,使用C語言編寫處理器模塊。mod_python提供了使用Python拜你些apache處理器擴展apache功能的方法。更多的apache請求處理過程,參考"Apache API Notes",或者參考"Mod_python-Integrating Python with Apache"文件。
為了方便的從CGI移植,標准的mod_python處理器提供了CGI模擬環境,允許用戶不修改遺留下來的腳本,而在大多數時候無需進行任何修改。
參考:
http://dev.apache.org
apache開發者資源
http://www.modpython.org/python10/
mod_python-整合Python和Apache,出現在Python 10(?)
1.3歷史
mod_python起源於Httpdapy項目(1997)。很久以後Httpdapy才被叫做mod_python,因為Httpdapy並不是特定用於apache服務器的。Httpdapy設計成跨平台的,而實際上主要從Netscape服務器開始(追溯到1997年的Nsapy)。
摘錄自Httpdapy項目的README文件的描述將Python嵌入到apache服務器的挑戰與解決方法。
""" #小字體
在我多年前開發第一個WEB應用程序時就發現CGI訪問數據庫非常慢,因為每次點擊請求都會裝入解釋器並執行數MB的數據。數據庫往往都很大,並將大量時間浪費在數據庫的連接/認證等"意義重大"的事情上,像DNS查詢、編碼與解碼、內存分配等等。在應用提速的壓力下,我嘗試過使用Python和多種工具的綜合使用。我並不迷信微軟的ASP,又被Netscape的性能和滿是臭蟲而郁悶。"Cold Fusion"(冷聚變)看起來有希望,但我稍後學會了HTML類標簽的書寫方式,可讀性跟匯編有一拼。比如PHP。但是我真的很想用Python來寫東西。
就在同時有關Python互聯網編程的書籍出版了,其中將Python嵌入到Netscape服務器的方式立即引起了我的注意。我在我的項目中使用了這個例子,並在稍後開發了我自己的改進版,叫做Nsapy,並在WindowsNT和Solaris上編譯。
盡管Nsapy僅能工作在Netscape服務器上,但是出於靈活通用的面向對象設計,在Python精靈中,很容易移植到其他的WEB服務器。
後來,曾經流行的Netscape服務器掛了,我就將Nsapy移植到最流行的服務器apache上。所以從Nsapy衍生出了Httpdapy。
"""
繼續這個傳奇,你會想到將Httpdapy移植到其他服務器上,實際上他們比預想要復雜而且枯燥。
反之,提供一個類似於Perl語言的apache擴展mod_perl一樣或更好性能的部件會更有意思。
俱往矣,mod_python的第一個版本發布於2000年5月。
完成...
第二章安裝
注意:獲得關於安裝的幫助和其他問題的最好地方是mod_python的郵件列表。可以發送標題為"subscribe"的郵件到[email protected]。
2.1先決條件
Python 2.2.1或更新的版本,早起版本將無法使用。
apache 2.0.40或更新的版本,如果要使用apache 1.3.x,請使用mod_python的版本2.7.x。
編譯mod_python需要有apache和Python的包含文件,並且確保安裝了Python標准庫。如果你從源代碼安裝了Python和apache,那麼你已經擁有了這些了。如果你使用了預打包軟件,如RPM或其他方式則只有二進制版本,而沒有源碼。通常apache和Python的包含文件和庫文件在各自的"development"包中。如果你不確定擁有這些重要文件,請從源碼安裝Python和apache,或者閱讀你系統的文檔以了解如何獲得開發包。
2.2編譯
有兩種鏈接apache模塊的方式:靜態的和DSO方式。
DSO方式現在非常流行,並推薦用於mod_python的安裝。模塊被編譯成共享庫,並在運行時動態裝入。
DSO方式的優勢在於安裝模塊時無需重新編譯apache。關於DSO機制的詳細信息參見http://httpd.apache.org/docs-2.0/dso.html。
當前版本的mod_python僅支持DSO方式。
靜態鏈接是一種較老的方式,比動態連接的方式支持更多的平台,但是較少使用。主要的缺陷是必須要重新編譯apache,在很多情況下並不是一個好的選擇。
2.2.1運行./configure
./configure腳本將會分析你的運行環境,並創建自定義的Make文件用於你的系統。使用autoconf生成的./configure包含如下內容:
查看apxs程序是否存在。這個程序作為apache標准發行版的一部分提供DSO支持。如果找不到則無法實現DSO功能。使用--with-apxs指定選項:
$ ./configure --with-apxs=/usr/local/apache/bin/apxs
強烈建議使用這個選項。
檢查Python版本,並嘗試找到libpython參數變量的二進制發行版。缺省時可以在Path變量中找到python。如果找到的首個python二進制版本不適合mod_python,則可以手動指定python的路徑使用--with-python,如:
$ ./configure --with-python=/usr/local/bin/python2.3
設置mod_python保留的互斥鎖數量。在某些系統中,互斥鎖是一種有限的資源。增加最大互斥鎖數量將會增加使用session鎖定的性能。缺省值是8,一個性能不錯的數值是32。使用-with-max-locks選項:
$ ./configure --with-max-locks=32
這個選項是在3.2.0版本開始提供的。
嘗試查找flex並確定版本。如果PATH中找不到flex則configure會出錯。如果版本不對則會給出警告。一般可以忽略這個警告,除非需要重新創建src/psp_parser.c。剖析器(parser)會被PSP調用,使用flex的C語言書寫。要求的版本是2.5.31,在大多數平台上2.5.4並不合適。所以已經源碼裡已經包含了一個psp_parser.c的副本。如果需要編譯src/psp_parser.c則需要獲取正確版本的flex。如果PATH中的flex版本有誤,則可用-with-flex選項:
$ ./configure --with-flex=/usr/local/bin/flex
這是3.2.0版本中的新特性
構建mod_python文檔時需要用到python的源代碼。可以如果不需要文檔,可以忽略這個選項。如果需要則用--with-python-src選項:
$ ./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
這將會簡單的將二進制版本復制到apache的libexec目錄。
並且會安裝python-libraries到site-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版本,你需要找到更適合的文檔。
創建一個在WEB站點可見的目錄,如htdocs/test。
在httpd.conf或者.htaclearcase/" target="_blank" >ccess文件中添加如下內容。如果是在.htaccess文件中,則無需<Directory>標簽。並且確保httpd.conf文件中的AllowOverride目標至少包含FileInfo,缺省是None,將會無法工作。
<Directory /APACHEHOME/htdocs/test>
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
</Directory>
重定向所有以.py結尾的URL到mod_python處理器。mod_python收到請求之後查找合適的處理器來處理請求。這裡有個簡單的自定義處理器叫mptest。我們看看如何定義這個處理器。
此時如果修改了主配置文件httpd.conf則需要重啟apache來使之生效。
編輯mptest.py文件在htdocs/test目錄。
from mod_python import apache
def handler(req):
req.content_type='text/plain'
req.write("Hello, world!")
return apache.OK
指向URL路徑到mptest.py。將會看到"Hello, world!"。如果看不到則參考故障處理。
依照配置文件的規則,指定任何.py文件都會最終指向mptest.py做處理。因為已經明確的指定了mptest做處理器。如果需要用不同的處理器處理不同的文件則需要更高層的處理器,比如publisher發布器、mpservlets或vampire。這些都是動態裝入的處理器。
如果都運行無誤則轉入第三章,入門。
參考:
http://home.comcast.net/d.popowich/mpservlets
http://www.dscpl.com.au/projects/vampire
2.5故障處理
如果出現問題,可以按照如下的處理:
檢查錯誤輸出
檢查服務器錯誤日志
單處理執行apache
$ ./httpd -X
這樣將會顯示更多有用信息
從mod_python3.2.0開始,可以使用mod_python.testhandler來診斷你的配置。添加到httpd.conf文件:
<Location /mpinfo>
SetHandler mod_python
PythonHandler mod_python.testhandler
</Location>
這時指向你的/mpinfo的URL則會顯示一些信息幫助處理mod_python的問題。
在mod_python郵件列表提問,並確保提供如下信息:
mod_python版本
操作系統類型、名字、版本號
Python版本、非常規的編輯選項
apache服務器版本
相關的apache配置,.htaccess
相關的Python代碼
完成...
[1] [2] [3] [4] [5] [6] [7] [8] 下一頁