= Trac和mod_python = [[ZhTracGuideToc]] Trac支持[http://www.modpython.org/ mod_python], 它显著加快了Trac的响应时间, 特别是和[ZhTracCgi CGI]相比, 并允许使用许多[wiki:ZhTracStandalone tracd]/mod_proxy无法使用的Apache特征. 这些指令用于Apache 2; 如果你还在使用Apache 1.3, 你可能需要在[wiki:TracModPython2.7 TracModPython2.7]碰运气了. == 简单的配置 == 如果你只安装了mod_python, 你可能还要在Apache配置中添加一行来载入模块: {{{ LoadModule python_module modules/mod_python.so }}} ''注意:模块的准确路径取决于HTTPD安装布局.'' 在Debian上使用apt-get {{{ apt-get install libapache2-mod-python libapache2-mod-python-doc }}} (还是在Debian上) 在你安装了mod_python后, 你必须启用apache2中的模块 (跟上面的Load Module指令相同): {{{ a2enmod mod_python }}} 在Fedora上使用yum: {{{ yum install mod_python }}} 通过增加下面内容到你的httpd.conf中, 你可以测试你的mod_python安装. 当你完成测试后, 基于安全原因, 你应该删除它. 注意: mod_python.testhandler仅仅在mod_python 3.2+才有. {{{ #!xml SetHandler mod_python PythonInterpreter main_interpreter PythonHandler mod_python.testhandler }}} mod_python上的Trac的一个简单设置如下: {{{ #!xml SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnv /var/trac/myproject PythonOption TracUriRoot /projects/myproject }}} '''`TracUriRoot`'''选项可有可无. 试试不带该选项进行配置, 如果Trac构造出的URL看起来是错的或如果Trac似乎不能正确地识别URL, 就添加'''`TracUriRoot`'''选项. 你将注意到, `Location`和'''`TracUriRoot`'''的路径是相同的. === 配置验证 === 配置密码文件和验证, 跟在[wiki:ZhTracCgi#AddingAuthentication CGI]中一样: {{{ #!xml AuthType Basic AuthName "myproject" AuthUserFile /var/trac/myproject/.htpasswd Require valid-user }}} 在Apache中配置mod_ldap验证需要一些技巧(httpd 2.2.x 和 OpenLDAP: slapd 2.3.19) 1. 你需要在Apache httpd.conf中载入下列模块 {{{ LoadModule ldap_module modules/mod_ldap.so LoadModule authnz_ldap_module modules/mod_authnz_ldap.so }}} 2. 你的httpd.conf需要如下这些: {{{ #!xml SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnv /home/trac/ PythonOption TracUriRoot /trac/ Order deny,allow Deny from all Allow from 192.168.11.0/24 AuthType Basic AuthName "Trac" AuthBasicProvider "ldap" AuthLDAPURL "ldap://127.0.0.1/dc=example,dc=co,dc=ke?uid?sub?(objectClass=inetOrgPerson)" authzldapauthoritative Off require valid-user }}} 或是到Microsoft Active Directory的LDAP接口: {{{ #!xml SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnv /home/trac/ PythonOption TracUriRoot /trac/ Order deny,allow Deny from all Allow from 192.168.11.0/24 AuthType Basic AuthName "Trac" AuthBasicProvider "ldap" AuthLDAPURL "ldap://adserver.company.com:3268/DC=company,DC=com?sAMAccountName?sub?(objectClass=user)" AuthLDAPBindDN ldap-auth-user@company.com AuthLDAPBindPassword "the_password" authzldapauthoritative Off # require valid-user require ldap-group CN=Trac Users,CN=Users,DC=company,DC=com }}} 注 1: 这是LDAP搜索得到多个OU的情况, 连接到AD的全局目录服务器部分(注意, 端口是3268, 而不是通常的LDAP 389). GCS基本上为一个"扁平"的树状结构, 允许不知道其所属的OU来搜索用户. 注 2: 访问Active Directory的记录, 要求验证用户/密码 (AuthLDAPBindDN 和 AuthLDAPBindPassword). 注 3: 指令"require ldap-group ..." 指定其成员可以访问的AD组. === 设置!PythonPath === 如果Trac安装包没有安装在你的Python路径中, 你需要使用`PythonPath`指令, 告诉Apache在哪里找到Trac mod_python处理程序: {{{ #!xml ... PythonPath "sys.path + ['/path/to/trac']" ... }}} 注意一下`PythonPath`指令, ''不是''`SetEnv PYTHONPATH`, 因为后者不起作用. == 设置多个项目 == Trac mod_python处理程序有一个类似Subversion的`SvnParentPath`配置选项, 叫做`TracEnvParentDir`: {{{ #!xml SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnvParentDir /var/trac PythonOption TracUriRoot /projects }}} 当你请求`/projects`URL时, 你会得到在`TracEnvParentDir`中设置的目录下所有Trac环境子目录的列表. 选择列表中的任意项目都会把你带到相应的Trac环境. 如果你不想将子目录列表作为你的项目主页, 你可以使用 {{{ #!xml }}} 它会指导Apache对所有非根目录的位置使用mod_python, 而同时又允许你在文档根目录中放入一个自定义主页. 你还可以通过使用``指令, 对所有的项目使用同样的验证域: {{{ #!xml AuthType Basic AuthName "Trac" AuthUserFile /var/trac/.htpasswd Require valid-user }}} == 虚拟机配置 == 下面的配置例子将trac设置为一个虚拟服务器(即:当你在类似!http://trac.mycompany.com的URL上访问它时): {{{ #!xml DocumentRoot /var/www/myproject ServerName trac.mycompany.com SetHandler mod_python PythonInterpreter main_interpreter PythonHandler trac.web.modpython_frontend PythonOption TracEnv /var/trac/myproject PythonOption TracUriRoot / AuthType Basic AuthName "MyCompany Trac Server" AuthUserFile /var/trac/myproject/.htpasswd Require valid-user }}} 如果你有登录的问题, 试试使用``而不是`` 对于支持多个项目的虚拟机, 将"`TracEnv`" /var/trac/myproject替换为"`TracEnvParentDir`" /var/trac/ == 疑难解答 == 通常, 如果你收到服务器的错误网页, 你可以查看Apache错误日志, 或者启用`PythonDebug`选项: {{{ #!xml ... PythonDebug on }}} 对于多个项目, 也试试重启服务器. === Expat相关的段错误(segmentation faults) === #expat 该问题大多数发生在使用python 2.4的Unix上. 在Python 2.4中, 使用Expat(一个用C写的XML解析库)的某些版本, 并且如果Apache使用了另一个版本, 将导致段错误(segmentation faults). 因为Trac 0.11使用的是Genshi, 将间接使用Expat, 该问题 将可能发生, 即使你从前使用Trac 0.10时一切正常. 参见Graham Dumpleton详细的[http://www.dscpl.com.au/wiki/ModPython/Articles/ExpatCausingApacheCrash 解释和解决办法]. === 表单提交问题 === 如果你在Trac中提交表单时遇到了问题(通常在提交后, 你被重定向到起始页), 检查{{{DocumentRoot}}}中是否包含一个与映射到mod_python处理器相同路径的目录或文件. 由于某种原因, mod_python映射到一个位置同时又匹配一个静态资源时, 它会很困惑. === 虚拟机配置的问题 === 如果使用指令, 设置`DocumentRoot`会造成一个''403 (Forbidden)''错误. 删除`DocumentRoot`指令, 或确认它指向的访问目录是允许的(在对应的``块中). 与`SetHandler`一起使用, 使得所有文件都要由mod_python来处理, 从而造成不能下载任何CSS或图片/图标. 我使用 `SetHandler None` 来绕开这个问题, 尽管我不知道这是否是最好的解决办法. === 使用 .htaccess === 尽管看起来可以用.htaccess文件来rewrite上述配置为文档根目录, 但却不起作用. Apache会向每个Trac URL中添加一个"/", 这样会干扰其正常的运行. 用mod_rewrite可能会让它起作用, 但我没有做到. 总之, 比起其价值来太麻烦了, 还是用前面提供的指导吧.:) === Win32 问题 === 如果你在Windows上运行trac和mod_python, 上传附件将不起作用. 这个问题在3.1.4或之后的mod_python版本中得到了解决, 因此请升级mod_python来修复它. === OS X 问题 === 在OS X上使用mod_python, 你无法用`apachectl restart`重启Apache. 这个问题在mod_python3.2中已经修复了, 但还有一个更早版本[http://www.dscpl.com.au/projects/vampire/patches.html here]的可用补丁包. === SELinux 问题 === 如果Trac报告类似''无法在db.lock获得共享锁'', 存储库的安全环境需要进行设置: {{{ chcon -R -h -t httpd_sys_content_t PATH_TO_REPOSITORY }}} 请参考[[http://subversion.tigris.org/faq.html#reposperms]] === FreeBSD 问题 === 如果你是自己编译安装的apache2, apache将不支持线程 (因为其在FreeBSD上工作欠佳). 你可以强制线程支持, 当运行apache的 ./configure时, 使用 --enable-threads, 但并不推荐这样. 最佳选项[[http://modpython.org/pipermail/mod_python/2006-September/021983.html 看起来是]] 增加 /usr/local/apache2/bin/ennvars行 {{{ export LD_PRELOAD=/usr/lib/libc_r.so }}} === Subversion 问题 === 如果你只在mod_python下遇到以下Trac错误''不支持的版本控制系统"svn"'', 但是在命令行甚至是在[ZhTracStandalone Trac独立服务器]下运行得很好, 有可能是你忘记了用[TracModPython#ConfiguringPythonPath PythonPath]指令添加Python绑定的路径了.(更好的办法是在Python的site-packages目录中, 增加一个到绑定的链接, 或者在该目录中创建一个.pth文件) 你同时需要较新版本的`mod_python`, 以避免源于多子解释器的默认用法导致的运行时错误({{{argument number 2: a 'apr_pool_t *' is expected}}}). 3.2.8 ''应该'' 工作, 然而, 可能的话, 最好使用#3371描述的变通方法, 要想强制使用主解释器: {{{ PythonInterpreter main_interpreter }}} 当使用Python的Subversion绑定及mod_python (#2611, #3455)时, 这是推荐处理其他众所周知的问题的变通方法. 参见Graham Dumpleton解释此问题的评论[comment:ticket:3455:9 #3455]. === 页面布局问题 === 如果Trac页面格式看起来很古怪, 可能是页面布局的样式表没有被web服务器处理. 试试在apache配置中增加下来几行: {{{ #!xml Alias /myproject/css "/usr/share/trac/htdocs/css" SetHandler None }}} 注意: 要是上述配置起作用, 必须将其放在你的项目根位置的后面, 即, {{{}}}. === HTTPS问题 === 如果你想完全使用https运行Trac, 你可能发现其试着重定向到普通http. 这种情况下, 只需在apache配置中增加下列行: {{{ #!xml DocumentRoot /var/www/myproject ServerName trac.mycompany.com SetEnv HTTPS 1 .... }}} === Fedora 7问题 === 确认你安装'python-sqlite2'包, 因为TracModPython(而不是tracd)需要它 === 使用php5-mhash或其他php5模块的分段错误(Segmentation fault) === 你也许遇到分段错误(segfaults) (由debian etch报道), 如果安装了php5-mhash模块. 试试删除它. 参见debian bug report [[http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=411487]] 当使用php5自带的第三方库(而没有用系统库)编译的php5, 一些人也会遇到问题. 请查看此处[[http://www.djangoproject.com/documentation/modpython/#if-you-get-a-segmentation-fault]] ---- 原文版本: TracModPython[[BR]] 相关信息: [ZhTracGuide Trac导览], [ZhTracInstall Trac安装], [ZhTracCgi TracCgi], [ZhTracFastCgi TracFastCgi][[BR]] See also: TracGuide, TracInstall, TracCgi, TracFastCgi