it-mure.jp.net

動的サブドメイン、mod_pythonおよびtrac

複数のサブドメインを実行しますが、最終的には多すぎて、それぞれが独自の構成ファイルを持つことができなくなります。私はvhostsを希望どおりに動作させているので、各サブドメインには、そのサブドメインのWebページを提供する/ 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として使用することはできません。次のようにURLからサブドメインを解析するPerlスクリプトをApache構成ファイルに記述しようとしました 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 ( [email protected] ) { warn [email protected] }

            return OK;

            } else {
            return DECLINED;
            }
            });
    </Perl>

それは私の初めてのPerlスクリプトなので、よくわかりません。問題を解決するtracにcgiを使用することは可能ですが、mod_pythonよりも約100倍遅くなります。

4
user34260

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 = ...]に取得する方法をテストして解決する必要があります。

Envを設定するときにpatternからの後方参照を使用できます([E=trac.env_path:%1]など。[E=trac.env_path:%{HTTP_Host}]などの他のenv変数を使用できるかどうかはわかりませんが、ドキュメントにはありません。これについて何か言ってください。あなたはそれができるはずだと思います。そうでない場合は、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変数を使用して必要なだけ渡し、trac-stable.wsgi内にenv.env_pathを作成できます。

3
silk