我将运行多个子域,最终子域数量太多,以至于每个子域都无法拥有自己的配置文件。我让虚拟主机按我想要的方式工作,因此每个子域都有自己的文件夹,例如 /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。