Я пытаюсь настроить Доска обзоров на Mac под управлением OS X Leopard (10.5.8) с Python 2.5 и mod_wsgi 3.3 установлен. Я использую sqlite и стандартный Apache 2, поставляемый с OS X; корень документа находится в /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-я страница в браузере со следующим:
Метод запроса: ПОЛУЧИТЬ
URL запроса: http://example.com/Используя URLconf, определенный в djblets.util.rooturl, 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 в браузере со следующим:
Метод запроса: ПОЛУЧИТЬ
URL запроса: http://example.com/reviewboard/dashboard/account/login/?next_page=/reviewboard/dashboard/Используя URLconf, определенный в djblets.util.rooturl, 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_python и lightppd и fastcgi, за исключением того, что я использую Apache и mod_wsgi.
Пока я могу разместить ReviewBoard по уникальному пути в существующем экземпляре сервера, мне все равно, где расположены фактические файлы сайта. Мы будем очень благодарны за помощь в установке и эксплуатации!
Я пришел к выводу, что @ptman прав, и что поддержка mod_wsgi с помощью ReviewBoard в лучшем случае надуманная. К счастью, я обнаружил обходные пути для создания mod_python под 10.5 и 10.6, а также на Intel и PowerPC. (Я использую сервер под своим рабочим столом - G5 под управлением 10.5.8, это лучшее, что он когда-либо мог получить.)
Вот сценарий bash, который я разработал для загрузки, настройки, сборки и установки. mod_python
для Apache в OS X:
#! /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!