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