4 votes

Sous-domaines dynamiques, mod_python et trac

Je vais gérer plusieurs sous-domaines, éventuellement trop nombreux pour que chacun puisse avoir ses propres fichiers de configuration. J'ai les vhosts qui fonctionnent comme je le souhaite, chaque sous-domaine a son propre dossier, par exemple /web/test, qui servira les pages web de ce sous-domaine. Je veux que chaque sous-domaine ait son propre projet SVN et trac, par exemple http ://test.mastersiege.com/trac, mais le problème est que l'on ne peut pas utiliser de variables dans Apache.

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

où $1 = sous-domaine. et je ne peux pas lier symétriquement le dossier trac dans le dossier home du sous-domaine et ensuite utiliser la racine doc de vhost_alias comme TracEnv. J'ai essayé d'écrire un script Perl script dans les fichiers de configuration d'Apache qui analyse le sous-domaine à partir de l'URL, comme suit Utiliser dynamiquement une URL dans un conteneur Vhost avec mod_perl b

            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>

C'est mon premier script perl script donc je ne suis pas sûr Il est possible d'utiliser cgi pour trac ce qui résoudrait le problème mais c'est environ 100x plus lent que mod_python.

3voto

silk Points 898

Je remplacerais mod_python par mod_wsgi. Dans cette configuration, vous pouvez définir TRAC_PATH avec une variable env.

Quelques extraits d'un exemple de configuration statique :

    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]

Il faudrait tester et trouver comment obtenir le sous-domaine ou le domaine dans la RewriteRule pour le [E=...].

Vous pouvez utiliser les renvois de modèle lors de la définition de l'env (comme [E=trac.env_path:%1] . Je ne sais pas si vous pouvez utiliser d'autres variables env comme [E=trac.env_path:%{HTTP_HOST}] La documentation ne dit rien à ce sujet. Je suppose que vous devriez être en mesure de le faire. Si ce n'est pas le cas, un peu plus de magie avec les RewriteRules peut peut-être vous aider.

trac-stable.wsgi pour référence :

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ée ultérieure - s'il n'est pas possible d'utiliser [E=trac.env_path:%{HTTP_HOST}] vous pouvez alors passer autant de variables env que nécessaire et construire le chemin env.env_path dans le fichier trac-stable.wsgi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X