Развертывание Django с Gunicorn и APACHE


У меня есть проект Django, и я хочу доставить его с помощью gunicorn (и Apache proxing). Я не могу использовать Nginx, так что это невозможно.

Я установил прокси Apache и настроил скрипт runner на gunicorn, но я получаю эту странную ошибку

2012-08-27 14:03:12 [34355] [DEBUG] GET /
2012-08-27 14:03:12 [34355] [ERROR] Error handling request
Traceback (most recent call last):
     File "/home/tileone/venv/lib/python2.6/site-packages/gunicorn/workers/sync.py", line 93, in handle_request
     self.address, self.cfg)
     File "/home/tileone/venv/lib/python2.6/site-packages/gunicorn/http/wsgi.py", line 146, in create
         path_info = path_info.split(script_name, 1)[1]
     IndexError: list index out of range

Я запускаю этот скрипт

#!/bin/bash
LOGFILE=/var/log/gunicorn/one-project.log
VENV_DIR=/path/to/venv/
LOGDIR=$(dirname $LOGFILE)
NUM_WORKERS=5
# user/group to run as
USER=USER
GROUP=GROUP
BIND=127.0.0.1:9999
cd /path_to_project
echo 'Setup Enviroment'
#some libraries
echo 'Setup Venv' 
source $VENV_DIR/bin/activate
export PYTHONPATH=$VENV_DIR/lib/python2.6/site-packages:$PYTHONPATH
#Setup Django Deploy
export DJANGO_DEPLOY_ENV=stage
echo 'Run Server'
test -d $LOGDIR || mkdir -p $LOGDIR
export SCRIPT_NAME='/home/tileone/one-project'
exec $VENV_DIR/bin/gunicorn_django -w $NUM_WORKERS --bind=$BIND
              --user=$USER --group=$GROUP --log-level=debug 
              --log-file=$LOGFILE 2>>$LOGFILE

И моя конфигурация apache выглядит так:

Alias /static/ /hpath_to_static/static/
Alias /media/ /path_to_static/media/
Alias /favicon.ico /path_to/favicon.ico

ProxyPreserveHost On
<Location />
   SSLRequireSSL
   ProxyPass http://127.0.0.1:9999/
   ProxyPassReverse http://127.0.0.1:9999/
   RequestHeader set SCRIPT_NAME /home/tileone/one-project/
   RequestHeader set X-FORWARDED-PROTOCOL ssl
   RequestHeader set X-FORWARDED-SSL on
</Location>

Что я делаю не так?

1 6

1 ответ:

В случае, если у кого-то есть подобные проблемы, мне удалось исправить это, удалив эквивалент:

RequestHeader set SCRIPT_NAME /home/tileone/one-project/

И вместо добавления к settings.py эквивалента:

FORCE_SCRIPT_NAME = '/one-project'

Конечно, для этого конфигурация apache должна быть больше похожа:

ProxyPreserveHost On
<Location /one-project/>
    SSLRequireSSL
    ProxyPass http://127.0.0.1:9999/
    ProxyPassReverse http://127.0.0.1:9999/
    RequestHeader set X-FORWARDED-PROTOCOL ssl
    RequestHeader set X-FORWARDED-SSL on
</Location>