动态子域名、mod_python 和 trac

动态子域名、mod_python 和 trac

我将运行多个子域,最终子域数量太多,以至于每个子域都无法拥有自己的配置文件。我让虚拟主机按我想要的方式工作,因此每个子域都有自己的文件夹,例如 /web/test,它将为该子域提供网页。我希望每个子域都有自己的 SVN 和 trac 项目,例如 http ://test.mastersiege.com/trac 问题是您不能在 apache 中使用变量。

<Location /trac>
   SetHandler mod_python
   PythonInterpreter main_interpreter
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnv /var/trac/$1
   PythonOption TracUriRoot /trac
</Location>

其中 $1 = 子域。我无法将 trac 文件夹符号链接到子域主文件夹,然后使用 vhost_alias 的 doc 根目录作为 TracEnv。我尝试在 apache 配置文件中编写一个 Perl 脚本,该脚本从 URL 解析子域,就像使用 mod_perl 在 Vhost 容器内动态使用 URL但它没有用

            use Apache2::ServerRec () ;
            use Apache2::ServerUtil ();
            use Apache2::RequestRec ();
            use Apache2::RequestUtil ();
            use Apache2::Const qw/OK DECLINED/;
            my $s = Apache2::ServerUtil->server;

            $s->push_handlers(PerlHeaderParserHandler => sub { my($r) = @_;
            if ( $r->hostname =~ m/(.*)\.([^.]+\.\w+)$/ ) {
            my($subdomain,$domain) = ($1,$2);

            my($TracPath) = "TracEnv /srv/trac/"+$subdomain;
            my($TracUri) = "TracUriRoot /testTrac";
            $Location{"/testTrac/"} = {
            SetHandler => "mod_python",
            PythonInterpreter => "main_interpreter",
            PythonHandler => "trac.web.modpython_frontend",
            PythonOption => $TracPath,
            PythonOption => $TracUri
            };

            if ( $@ ) { warn $@ }

            return OK;

            } else {
            return DECLINED;
            }
            });
    </Perl>

这是我的第一个 perl 脚本,所以我不确定。可以使用 cgi 来解决问题,但它比 mod_python 慢 100 倍

答案1

我会将 mod_python 更改为 mod_wsgi。在此配置中,您可以使用环境变量设置 TRAC_PATH。

示例静态配置的一些摘录:

    WSGIDaemonProcess tracproc user=www-data group=www-data processes=1 threads=25
    WSGIProcessGroup tracproc

   <Directory /srv/wsgi>
        WSGIProcessGroup tracproc
        Order deny,allow
        Allow from all
        WSGIApplicationGroup %{GLOBAL}
    </Directory>

   <Location /trac>
        Require valid-user
        AuthType Basic
        ...
    </Location>
    WSGIScriptAlias /trac /srv/wsgi/trac-stable.wsgi

    RewriteCond %{REQUEST_URI} ^/trac/ [OR]
    RewriteCond %{REQUEST_URI} ^/trac$
    RewriteRule . - [E=trac.env_path:/srv/tracenv]

您必须测试并研究如何将 RewriteRule 中的子域或域获取到 [E=...]。

您可以使用反向引用图案当设置环境时(例如[E=trac.env_path:%1]。我不确定您是否可以在那里使用其他环境变量,例如[E=trac.env_path:%{HTTP_HOST}],文档没有提到这一点。我想你应该可以做到这一点。如果不能,那么使用 RewriteRules 的一些魔法可能会有所帮助。

trac-stable.wsgi 供参考:

import sys
sys.stdout = sys.stderr

# when Trac is not in default python sitedir
#import site
#site.addsitedir('/opt/trac-0.11/lib/python2.5/site-packages')

__requires__ = 'Trac=0.11.6'
from pkg_resources import load_entry_point

import os
os.environ['PYTHON_EGG_CACHE'] = '/srv/python_eggs'
os.environ['LC_TIME'] = 'pl_PL.UTF-8'

import trac.web.main

application = trac.web.main.dispatch_request

后来的想法 - 如果无法使用,[E=trac.env_path:%{HTTP_HOST}]那么您可以根据需要传递尽可能多的环境变量,并在 trac-stable.wsgi 中构造 env.env_path。

相关内容