如何在非 root 位置使用 mod_wsgi 和 Apache 配置 ReviewBoard

如何在非 root 位置使用 mod_wsgi 和 Apache 配置 ReviewBoard

我正在尝试配置审查委员会在运行 OS X Leopard (10.5.8) 和 Python 2.5 的 Mac 上mod_wsgi已安装 3.3。我使用的是 sqlite 和 OS X 附带的标准 Apache 2;文档根目录位于/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/,我在 Apache access_log 中得到以下内容:

"GET /reviewboard/ HTTP/1.1" 404 1923

浏览器中出现 404 页面,内容如下:

请求方法:GET
请求URL: http://example.com/

使用 djblets.util.rooturl 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式:
  ^reviewboard/
当前 URL 与dashboard/以下任何一个都不匹配。

这似乎与以下报告的类似问题几乎相同Apache 和 mod_wsgi,所以我尝试了该线程中建议的方法......


当我在 conf/settings_local.py 中有以下内容时:

SITE_ROOT = ''
FORCE_SCRIPT_NAME = '/reviewboard'
DEBUG = True

我去拜访http://example.com/reviewboard/(重新启动 Apache 后),我在 Apache access_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_pythonlightppd 和 fastcgi,除非我使用 Apache 和 mod_wsgi。


只要我能让 ReviewBoard 托管在现有服务器实例中的唯一路径上,我就不会太在意实际站点文件位于何处。如果能帮助我启动并运行它,我将不胜感激!

答案1

我得出的结论是 @ptman 是正确的,ReviewBoard 对 mod_wsgi 的支持充其量也只是似是而非。幸运的是,我发现了在 10.5 和 10.6 以及 Intel 和 PowerPC 上构建 mod_python 的变通方法。(我使用的办公桌下的服务器是运行 10.5.8 的 G5,这是它有史以来最好的。)

mod_python这是我开发的用于在 OS X 上下载、配置、构建和安装 Apache 的 bash 脚本:

#! /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>

为了方便起见,我只是从适当的 Apache 配置目录中对其进行了符号链接:

sudo ln -s /Library/WebServer/Documents/reviewboard/conf/apache-modpython.conf \
           /etc/apache2/other/reviewboard.conf

希望这对其他想要做同样事情的人有所帮助。感谢@ptman 的正确指导!

相关内容