Назад | Перейти на главную страницу

Динамические поддомены, mod_python и trac

Я собираюсь запустить несколько поддоменов, в конечном итоге слишком много, чтобы у каждого были свои собственные файлы конфигурации. У меня 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.