Apache使用mod_wsgi安裝Trac

Apache使用mod_wsgi安裝Trac

2010-01-23

轉自:http://www.zhigang.net/post/8010

Trac是一款使用Python開發的WEB項目管理系統,集SVN、文檔、任務管理於一體,基於BSD協議發佈。

Trac在Apache上的選擇一般只有CGI、FastCGI、mod_python幾種選擇,CGI速度太慢,FastCGI在Apache上的表現又不夠穩定,似乎只有一個mod_python的選擇可用,而WSGI的出現改變了這一情況,這個2006年誕生的標準得到了Python WEB開發領域的一致歡迎,Trac也對此提供了支持。

mod_wsgi的下載安裝請參考這裏:http://code.google.com/p/modwsgi/

編譯完成後,修改httpd.conf文件,確認如下選項是打開的:

LoadModule wsgi_module modules/mod_wsgi.so

創建trac.wsgi文件,這是一個Python文件:

  1. import os  
  2.   
  3. os.environ['TRAC_ENV'] = '/path/to/trac'  
  4. os.environ['PYTHON_EGG_CACHE'] = '/tmp'  
  5.   
  6. import trac.web.main  
  7. application = trac.web.main.dispatch_request  

Apache配置,請將以下代碼放入httpd.conf:

WSGIScriptAlias /trac /paty/to/trac/trac.wsgi
<Directory /paty/to/trac>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

配置完成後,若顯示不正常,可將wsgi腳本改爲如下內容,測試是否可輸出“Hello World!”

  1. def application(environ, start_response):  
  2.         start_response('200 OK',[('Content-type','text/html')])  
  3.         return ['<html><body>Hello World!</body></html>']  

 

若以上腳本執行成功,則代表wsgi安裝正確,但如果你使用的是Python 2.4以上版本可能會遇到另一個問題,那就是Trac始終顯示白頁,沒有任何輸出!

檢查error.log文件

httpd: Objects/stringobject.c:105: PyString_FromString: Assertion `str != ((void *)0)' failed.
[Fri Mar 20 20:39:03 2009] [notice] child pid 8734 exit signal Aborted (6)

由此可得知mod_wsgi線程崩潰掉了,Google一下,在這裏得到一些資料,看來wsgi應用在Apache下崩潰的不止是Trac,Django也是有可能的。

根據作者的提示得知,這是由於Apache與Python的expat庫版本不匹配導致。

Apache expat版本:

httpd-2.2.8/lib $ strings libexpat.so.0.1.0 | grep expat_
expat_1.95.2

Python expat版本:

/opt/httpd-2.2.8/lib $ python
Python 2.4.3 (#1, May 24 2008, 13:47:28)
[GCC 4.1.2 20070626 (Red Hat 4.1.2-14)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pyexpat
>>> pyexpat.EXPAT_VERSION
'expat_1.95.8'

找到原因後就好辦了,但是作者只提了一句下載expat 2.0.1安裝,卻沒說如何安裝到Apache,Apache的configure本身並沒有with-expat參數,只有apache_src/srclib/apr-util/configure有這個參數卻不知如何關聯,無奈之下另找方案。

檢查httpd依賴的庫:

/opt/httpd-2.2.8/bin $ ldd httpd
        linux-gate.so.1 =>  (0x002e6000)
        libm.so.6 => /lib/libm.so.6 (0x00cd8000)
        libaprutil-1.so.0 => /opt/httpd-2.2.8/lib/libaprutil-1.so.0 (0x00c1e000)
        libexpat.so.0 => /opt/httpd-2.2.8/lib/libexpat.so.0 (0x00925000)
        libapr-1.so.0 => /opt/httpd-2.2.8/lib/libapr-1.so.0 (0x003df000)
        libuuid.so.1 => /lib/libuuid.so.1 (0x00110000)
        librt.so.1 => /lib/librt.so.1 (0x00d91000)
        libcrypt.so.1 => /lib/libcrypt.so.1 (0x0023d000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00d01000)
        libdl.so.2 => /lib/libdl.so.2 (0x00cd2000)
        libc.so.6 => /lib/libc.so.6 (0x00402000)
        /lib/ld-linux.so.2 (0x00b6f000)

由此可知Apache使用的是/opt/httpd-2.2.8/lib/libexpat.so.0,而這個文件是一個軟鏈接,嘗試將其刪除,重新指到2.0.1:

/opt/httpd-2.2.8/lib $ ln -s /opt/expat-2.0.1/lib/libexpat.so.1.5.2 libexpat.so.0

重新啓動Apache, 測試成功!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章