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文件:
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!”
若以上脚本执行成功,则代表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, 测试成功!