【问题标题】:Deploy Django with Gunicorn and APACHE使用 Gunicorn 和 APACHE 部署 Django
【发布时间】:2012-08-22 02:24:41
【问题描述】:

我有一个 Django 项目,我想使用 gunicorn(和 apache 代理)交付它。 我不能使用 Nginx,所以这是不可能的。

我已经设置了 Apache 代理并将运行脚本设置为 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>

我做错了什么?

【问题讨论】:

    标签: django apache deployment proxy gunicorn


    【解决方案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>
    

    【讨论】:

      【解决方案2】:

      在接受的答案中提出修复的原因是您需要在以下两种方法之一之间做出决定:

      1. 让 HTTP 服务器在将请求转发到 WSGI 服务器之前剥离位置子路径(如上所述......当 Location 和 ProxyPass 指令都以正斜杠结尾时完成。Nginx 的行为方式相同) .在这种情况下,您可能不会使用 SCRIPT_NAME HTTP 标头/gunicorn-env-variable,因为 gunicorn 会尝试从传入的 URL 中删除值(但这会失败,因为 Web 服务器 Apache 已经这样做了)。在这种情况下,你不得不使用 Django 的 FORCE_SCRIPT_NAME 设置。
      2. 让传递给 gunicorn 的请求 URL 未经修改(URL 的示例可能是 /one-project/admin),并使用 SCRIPT_NAME HTTP 标头(或 gunicorn-env-variable)。因为在 Django 处理构建响应之前,gunicorn 将修改请求并从 URL 中删除 SCRIPT_NAME 的值。

      我更喜欢选项 2,因为您只需要更改一个文件,即 Web 服务器配置,所有更改都整齐地放在一起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-05
        • 2020-12-26
        • 1970-01-01
        • 2013-12-08
        • 2015-08-01
        • 2015-06-02
        • 1970-01-01
        相关资源
        最近更新 更多