【问题标题】:Issues in django deployment with two subdomains using Apache auth使用 Apache auth 的两个子域的 django 部署问题
【发布时间】:2013-10-05 19:14:43
【问题描述】:

我正在部署具有两个站点的 Django 1.5,每个站点都独立于另一个站点(每个站点都有自己的数据库),但这两个站点是子域:一个是 new.mydomain.com,另一个是 dev.mydomain.com。我正在使用带有 mod_wsgi 的 Apache。

问题是:我是 Authenticating against Django’s user database from Apache 正确,但是当我尝试将 Django 组与 Apache 身份验证一起使用时,出现以下情况:

我可以登录其中一个子域,例如new 没有问题,但如果我尝试登录另一个 (dev) 我不能。 Apache 说用户不在允许的组中。然后如果我重新启动 Apache 并尝试登录到 dev(以前这是不可能的)那么这里没有问题,但是现在用另一个子域 new 登录是不可能的!

总结一下:无论我使用哪个(允许)用户,我都无法同时登录两个超级域。

new 子域的虚拟主机是(另一个看起来像这个改变路径):

<VirtualHost *:80>
    ServerName new.mydomain.com
    ServerAlias www.new.mydomain.com
    ServerAdmin caumons@gmail.com

    Alias /robots.txt /var/www/sites/master/EurekaStart.git/EurekaStart/robots.txt
    Alias /favicon.ico /var/www/sites/master/EurekaStart.git/EurekaStart/static_collected/img/favicon.ico

    Alias /static/ /var/www/sites/master/EurekaStart.git/EurekaStart/static_collected/

    <Directory /var/www/sites/master/EurekaStart.git/EurekaStart/static_collected>
        Order deny,allow
        Allow from all
    </Directory>

    Alias /media/ /var/www/sites/master/EurekaStart.git/EurekaStart/media/

    <Directory /var/www/sites/master/EurekaStart.git/EurekaStart/media>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIDaemonProcess eureka-startups.com python-path=/var/www/sites/master/EurekaStart.git:/var/www/sites/master/EurekaStart.git/env/lib/python2.7/site-packages
    WSGIProcessGroup eureka-startups.com

    WSGIScriptAlias / /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py

    <Directory /var/www/sites/master/EurekaStart.git/EurekaStart>
        <Files wsgi.py>
            Order deny,allow
            Allow from all
        </Files>
    </Directory>

    <Location "/">
        AuthType Basic
        AuthName "Enter your guest user & password"
        Require group guest
        Require valid-user
        AuthBasicProvider wsgi
        WSGIAuthUserScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py
        WSGIAuthGroupScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py
    </Location>

    ErrorLog /var/www/sites/master/EurekaStart.git/logs/apache/error.log
    TransferLog /var/www/sites/master/EurekaStart.git/logs/apache/access.log
</VirtualHost>

new 子域的wsgi.py 文件看起来像(dev 的 wsgi 文件与此完全相同):

import os
import sys
from django.core.handlers.wsgi import WSGIHandler

# We need to add the site's root path to sys.path when using Django Authentication for WSGI
SITE_PKG_PATH = os.path.abspath(os.path.dirname(__file__))
SITE_ROOT_PATH = os.path.abspath(os.path.join(SITE_PKG_PATH, '..'))
sys.path.append(SITE_ROOT_PATH)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "EurekaStart.settings")


# This import MUST be done after setting `DJANGO_SETTINGS_MODULE`
import django.contrib.auth.handlers.modwsgi as modwsgi


def check_password(environ, user, password):
    return modwsgi.check_password(environ, user, password)


def groups_for_user(environ, user):
    return modwsgi.groups_for_user(environ, user)


application = WSGIHandler()

更新 1:

非常感谢@GrahamDumpleton :)

我已经更新了 apache 配置文件以及我设置 DJANGO_SETTINGS_MODULE 的方式。现在,Apache WSGI 的配置如下:

new 站点:

WSGIDaemonProcess eureka-startups.com python-path=/var/www/sites/master/EurekaStart.git:/var/www/sites/master/EurekaStart.git/env/lib/python2.7/site-packages
WSGIProcessGroup eureka-startups.com

<Location "/">
    AuthType Basic
    AuthName "Enter your guest user & password"
    AuthBasicProvider wsgi
    Require group guest
    Require valid-user
    WSGIAuthUserScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py application-group=eureka-startups.com
    WSGIAuthGroupScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py application-group=eureka-startups.com
</Location>

dev 站点:

WSGIDaemonProcess dev.eureka-startups.com python-path=/var/www/sites/dev/EurekaStart-dev.git:/var/www/sites/dev/EurekaStart-dev.git/env/lib/python2.7/site-packages
WSGIProcessGroup dev.eureka-startups.com

<Location "/">
    AuthType Basic
    AuthName "Eureka-Startups staff members only"
    AuthBasicProvider wsgi
    Require group dev
    Require valid-user
    WSGIAuthUserScript /var/www/sites/dev/EurekaStart-dev.git/EurekaStart/wsgi.py application-group=dev.eureka-startups.com
    WSGIAuthGroupScript /var/www/sites/dev/EurekaStart-dev.git/EurekaStart/wsgi.py application-group=dev.eureka-startups.com
</Location>

【问题讨论】:

    标签: django apache authentication mod-wsgi django-deployment


    【解决方案1】:

    你是如何设置 SESSION_COOKIE_DOMAIN 的?

    还有 SESSION_COOKIE_NAME?

    这两个网站是否相同?域的那个至少应该指子域而不是主域。


    更新 1

    代替:

    WSGIAuthUserScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py
    WSGIAuthGroupScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py
    

    使用:

    WSGIAuthUserScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py application-group=new.mydomain.com
    WSGIAuthGroupScript /var/www/sites/master/EurekaStart.git/EurekaStart/wsgi.py application-group=new.mydomain.com
    

    由 WSGIAuthUserScript 和 WSGIAuthGroupScript 运行的 Python 代码始终在 Apache 子工作进程中运行,而不是在主 Web 应用程序所在的守护进程模式进程中运行。

    在您的情况下,更多问题是默认情况下代码在主解释器(应用程序组)上下文中运行。因为你有两个站点,所以代码不会分开。

    通过在这些指令上使用 application-group 选项,您可以强制每个单独站点的代码在它们运行的​​进程的不同子解释器中运行。为其他站点的 application-group 使用不同的值。

    你也不能使用:

    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "EurekaStart.settings")
    

    你必须使用:

    os.environ["DJANGO_SETTINGS_MODULE"] = "EurekaStart.settings"
    

    使用 dict.setdefault() 在同一进程中被多个站点使用时会导致问题,即使在不同的子解释器中也是如此。更多详情见:

    【讨论】:

    • 我没有在设置中设置这个值。我现在尝试将SESSION_COOKIE_DOMAIN = 'new.eureka-startups.com' 设置为一个,SESSION_COOKIE_DOMAIN = 'dev.eureka-startups.com' 设置为另一个,但仍然发生相同的情况... :( 我没有更改SESSION_COOKIE_NAME,这真的重要吗?
    • 抱歉,假设您使用的是普通的 Django 登录,而不是带有自定义密码验证器的 Apache 基本身份验证。请参阅上面的更新。
    • 非常感谢您的回复,您是一位先生!现在效果很好! :) 我已经更新了我的问题以反映所做的更改。但是,我有一些疑问:我尝试包含指令WSGIApplicationGroup 而不是使用application-group,但它不起作用。会不会一样?在wsgi.py 中,我不知道使用application = WSGIHandler()application = get_wsgi_application() 有什么区别。有关系吗?而且......像我一样为同一个虚拟主机使用WSGIDaemonProcessWSGIProcessGroup 相同的名称是不是很糟糕?再次,谢谢! :)
    • P.D.您附加的链接中提供的信息非常好:)
    • 为用户/组身份验证脚本覆盖应用程序组的唯一方法是应用程序组选项。 WSGIApplicationGroup 仅适用于使用 WSGIScriptAlias 的主要 Web 应用程序设置。 WSGIScriptAlias 也可以采用应用程序组选项,该选项将覆盖其他任何内容。
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2018-01-13
    • 2014-07-11
    • 2011-06-25
    • 2013-08-03
    • 2011-03-19
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多