web-dev-qa-db-ja.com

ルート以外の場所でmod_wsgiとApacheを使用してReviewBoardを構成する方法

Python 2.5および mod_wsgi 3.3がインストールされているOSX Leopard(10.5.8)を実行しているMacで ReviewBoard を構成しようとしています。私はsqliteとOSXに付属の標準のApache2を使用しています。ドキュメントルートは_/Library/WebServer/Documents/_にあります。私のマシンはすでにこのルート内の他のパスで他のいくつかのものをホストしているので、ReviewBoardを提供したいと思います。サーバールートではなくパスで。

サイトを作成し、必要な所有者とアクセス許可を設定し、Apache構成ファイルをシンボリックリンクして、サーバールートとしてホストする行を削除しました。これが私の_conf/Apache_wsgi.conf_です:

_WSGIScriptAlias "/reviewboard" "/Library/WebServer/Documents/reviewboard/htdocs/reviewboard.wsgi"

<Directory "/Library/WebServer/Documents/reviewboard/htdocs">
    AllowOverride All
</Directory>

# Alias static media requests to filesystem
Alias /reviewboard/media "/Library/WebServer/Documents/reviewboard/htdocs/media"
_

しかし、ReviewBoardを起動させることができず、404エラーページしか表示されません。


Conf/settings_local.pyに次のものがある場合:

_SITE_ROOT = '/reviewboard/'
FORCE_SCRIPT_NAME = ''
DEBUG = True
_

http://example.com/reviewboard/ にアクセスすると、Apacheaccess_logに次のように表示されます。

_"GET /reviewboard/ HTTP/1.1" 404 1923
_

そして、ブラウザの404ページには次のものがあります。

リクエスト方法:GET
リクエストURL: http://example.com/

Djblets.util.rooturlで定義されているURLconfを使用して、Djangoは次の順序でこれらのURLパターンを試しました:
_^reviewboard/_
現在のURL _dashboard/_は、これらのいずれとも一致しませんでした。

これは、 Apache and mod_wsgi で報告された同様の問題とほぼ同じように見えるので、そのスレッドで提案されているアプローチを試しました...


Conf/settings_local.pyに次のものがある場合:

_SITE_ROOT = ''
FORCE_SCRIPT_NAME = '/reviewboard'
DEBUG = True
_

http://example.com/reviewboard/ (Apacheを再起動した後)にアクセスすると、Apacheaccess_logに次のように表示されます。

_"GET /reviewboard HTTP/1.1" 301 -
"GET /reviewboard/dashboard/ HTTP/1.1" 302 -
"GET /reviewboard/dashboard/account/login/?next_page=/reviewboard/dashboard/ HTTP/1.1" 404 2871
_

そして、次のブラウザの404:

リクエスト方法:GET
リクエストURL: http://example.com/reviewboard/dashboard/account/login/?next_page=/reviewboard/dashboard/

Djblets.util.rooturlで定義されているURLconfを使用して、Djangoは次の順序でこれらのURLパターンを試しました:
_^ ^admin/_
^ ^media/(?P<path>.*)$
_^ ^account/_
_^ ^api/_
_^ ^r/_
_^ ^reports/_
_^ ^dashboard/$_
_^ ^users/$_
^ ^users/(?P<username>[A-Za-z0-9@_\-\.]+)/$
_^ ^groups/$_
^ ^groups/(?P<name>[A-Za-z0-9_-]+)/$
^ ^groups/(?P<name>[A-Za-z0-9_-]+)/members/$
^ ^feeds/rss/(?P<url>.*)/$
^ ^feeds/atom/(?P<url>.*)/$
_^ ^account/logout/$_
_^ ^$_
_^ ^iphone/_
現在のURL _dashboard/account/login/_は、これらのいずれとも一致しませんでした。

これは、Apacheとmod_wsgiを使用していることを除いて、 Apacheとmod_pythonlightppdとfastcgi で報告された問題に似ています。


ReviewBoardを既存のサーバーインスタンスの一意のパスでホストできる限り、実際のサイトファイルがどこにあるかはあまり気にしません。これを立ち上げて実行するのを手伝っていただければ幸いです。

2
Quinn Taylor

@ptmanは正しく、ReviewBoardでのmod_wsgiのサポートはせいぜい疑わしいと結論付けました。幸い、10.5と10.6の両方で、IntelとPowerPCでmod_pythonをビルドするための回避策を発見しました。 (私が使用している机の下のサーバーは、10.5.8を実行しているG5であり、これはこれまでで最高です。)

これは、ダウンロード、構成、ビルド、およびインストールするために開発したbashスクリプトですmod_python OS X上のApacheの場合:

#! /bin/bash
cd ~/Downloads
curl -O http://archive.Apache.org/dist/httpd/modpython/mod_python-3.3.1.tgz
tar xvzf mod_python-3.3.1.tgz
cd mod_python-3.3.1
# Detect kernel version (OS X 10.5.x is "9.x.0", OS X 10.6.x is "10.x.0", etc.)
if [ `uname -r | cut -d . -f 1` -ge 10 ]; then
    echo "*** Code change to compile on 10.6+"
    cp src/connobject.c src/connobject.c.orig
    sed 's/APR_BRIGADE_SENTINEL(b)/APR_BRIGADE_SENTINEL(bb)/g' src/connobject.c.orig > src/connobject.c
    diff -u src/connobject.c.orig src/connobject.c
    echo
fi
./configure
# See http://mike.crute.org/blog/mod_python-on-leopard for Makefile changes.
# On a G5 we have to explicitly build ppc64 or Apache won't load the module.
cp src/Makefile src/Makefile.orig
if [ `Arch` == "ppc" ]; then
    sed -e 's/^(LDFLAGS=.*)$/\1 -Arch ppc -Arch ppc64/g' \
        -e 's/^(CFLAGS=.*)$/\1 -Arch ppc -Arch ppc64/g' \
        -e 's/(\$\(APXS\) \$\(INCLUDES\) -c)/\1 -Wc,"-Arch ppc" -Wc,"-Arch ppc64"/g' \
        -E src/Makefile.orig > src/Makefile
else
    sed -e 's/^(LDFLAGS=.*)$/\1 -Arch i386 -Arch x86_64/g' \
        -e 's/^(CFLAGS=.*)$/\1 -Arch i386 -Arch x86_64/g' \
        -e 's/(\$\(APXS\) \$\(INCLUDES\) -c)/\1 -Wc,"-Arch i386" -Wc,"-Arch x86_64"/g' \
        -E src/Makefile.orig > src/Makefile
fi
make
Sudo make install
Sudo apxs -e -a -n 'python' mod_python.la

これが完了し、ReviewBoardとそのすべての依存関係がインストールされた状態で、サーバーのルートディレクトリ内にサイトを作成し、mod_pythonを使用するように構成しました。

rb-site install /Library/WebServer/Documents/reviewboard

これが私のconf/Apache-modpython.conf既存のサーバーのサブパスでReviewBoardサイトをホストするには:

<Location "/reviewboard/">
    PythonPath "['/Library/WebServer/Documents/reviewboard/conf'] + sys.path"
    SetEnv Django_SETTINGS_MODULE reviewboard.settings
    SetEnv PYTHON_Egg_CACHE "/Library/WebServer/Documents/reviewboard/tmp/Egg_cache"
    SetEnv HOME "/Library/WebServer/Documents/reviewboard/data"
    SetHandler mod_python
    PythonHandler Django.core.handlers.modpython
    PythonAutoReload Off
    PythonDebug Off
    # Used to run multiple mod_python sites in the same Apache
    PythonInterpreter reviewboard_reviewboard
</Location>

<Location "/reviewboard/media">
    SetHandler None
</Location>

Alias /reviewboard/media "/Library/WebServer/Documents/reviewboard/htdocs/media"

<Directory "/Library/WebServer/Documents/reviewboard/htdocs">
    AllowOverride All
</Directory>

便宜上、適切なApacheconfigディレクトリからシンボリックリンクしました。

Sudo ln -s /Library/WebServer/Documents/reviewboard/conf/Apache-modpython.conf \
           /etc/Apache2/other/reviewboard.conf

これが同じことをしようとしている他の誰かに役立つことを願っています。正しい方向にプッシュしてくれてありがとう、@ ptman!

2
Quinn Taylor