Я собираюсь запустить несколько поддоменов, в конечном итоге слишком много, чтобы у каждого были свои собственные файлы конфигурации. У меня vhosts работают так, как я хочу, поэтому каждый поддомен имеет свою собственную папку, например / 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 как TracEnv. Я попытался написать сценарий Perl в файлах конфигурации apache, который анализирует поддомен с URL-адреса, как и Динамическое использование URL-адреса в контейнере Vhost с mod_perl но это не сработало
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 для trac, который решит проблему, но он примерно в 100 раз медленнее, чем mod_python
Я бы изменил mod_python на mod_wsgi. В этой конфигурации вы можете установить TRAC_PATH с переменной env.
Некоторая выдержка из образца статической конфигурации:
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 = ...].
Вы можете использовать обратные ссылки из шаблон при установке env (например, [E=trac.env_path:%1]
. Я не уверен, что вы можете использовать там другие переменные env, например [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}]
тогда вы можете передать столько, сколько вам нужно, с переменными env и построить env.env_path внутри trac-stable.wsgi.