Subdomínios dinâmicos, mod_python e trac

4

Eu vou estar executando vários subdomínios, eventualmente, muitos para poderem cada um ter seus próprios arquivos de configuração. Eu tenho os vhosts trabalhando como eu os quero, então cada subdomínio tem sua própria pasta, por exemplo, / web / test, que servirá páginas da Web para esse subdomínio. Eu quero ter cada subdomínio tem seu próprio projeto SVN e trac, por exemplo, http: //test.mastersiege.com/trac o problema é que você não pode usar variáveis no apache.

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

em que $ 1 = subdomínio. e eu não consigo vincular sym a pasta trac na pasta home dos subdomínios e então usar a raiz doc do vhost_alias como TracEnv. Eu tentei escrever um script Perl nos arquivos de configuração do Apache, que analisa o subdomínio do URL muito parecido com Usando URL dentro do container Vhost com mod_perl dinamicamente mas não funcionou  

            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>

Esse é o meu primeiro script perl, então estou inseguro .. É possível usar o cgi para trac, o que resolveria o problema, mas é cerca de 100x mais lento que o mod_python

    
por Community 09.02.2010 / 05:18

1 resposta

3

Eu mudaria o mod_python para mod_wsgi. Nesta configuração você pode definir TRAC_PATH com uma variável env.

Alguns trechos da configuração estática de amostra:

    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]

Você teria que testar e descobrir como obter subdomínio ou domínio no RewriteRule para [E = ...].

Você pode usar referências anteriores de padrão ao definir o env (como [E=trac.env_path:%1] . Não tenho certeza se você pode usar outras variáveis env como [E=trac.env_path:%{HTTP_HOST}] , a documentação não diz Eu acho que você deveria ser capaz de fazer isso, se não, então um pouco mais de magia com o RewriteRules pode ajudar.

trac-stable.wsgi para referência:

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

Idéia posterior - se não for possível usar [E=trac.env_path:%{HTTP_HOST}] , você pode passar o quanto precisar com as variáveis env e construir o env.env_path dentro do trac-stable.wsgi.

    
por 09.02.2010 / 22:36