使用Apache身份验证的两个子域的django部署中的问题

时间:2013-09-30 02:11:54

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

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

问题是:我Authenticating against Django’s user database from Apache正确,但是当我尝试使用Apache身份验证的Django组时,我会遇到以下情况:

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

总结:无论我使用哪个(允许的)用户,我都无法同时登录这两个sudomains。

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> 子域的wsgi.py文件看起来像(new的wsgi文件与此完全相同):

dev

更新1:

非常感谢@ GrahamDumpleton:)

我已经更新了apache配置文件以及我设置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() 的方式。现在,关于Apache的WSGI的配置如下:

DJANGO_SETTINGS_MODULE网站:

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

1 个答案:

答案 0 :(得分: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()会导致同一进程中多个站点使用时出现问题,即使在不同的子解释器中也是如此。有关详细信息,请参阅: