使用Apache和多个Django站点的奇怪,不一致的行为

时间:2013-10-26 06:22:01

标签: python django apache mod-wsgi

我有两个mod_wsgi django网站和四个域名。两个域指向每个站点。当我使用chrome中的所有四个域访问我的两个站点时,它们都可以正常工作。但只是大部分时间。有时,给定域名,会突然显示错误的站点。完全出乎意料。

这变得非常混乱,因为这种行为完全不可预测。我在网站A上关注了一些内部链接,突然间,来自网站B的404 error出现了(当然,网站中的网址无法解析,因为它是来自网站A的网址)。我可以在不更改网址的情况下刷新页面,然后突然它会带回网站A.或者它会留在错误的网站并再次404,你永远不知道。

我已经在代理(例如hidemyass.com)上尝试过,并且会发生同样不可预测的结果。

关于它的唯一可预测性是在apachectl -k graceful之后,暂时没有站点切换,但之后,它每两页发生一次。我向你保证这不是偏见。

这是我的httpd:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.siteA.tk
    ServerAlias siteA.tk
    WSGIScriptAlias / /home/me/siteA/siteA/wsgi.py
    Alias /static/ /var/www/siteA/static/

</VirtualHost>

<VirtualHost *:80>
    ServerName www.siteA.com
    ServerAlias siteA.com
    WSGIScriptAlias / /home/me/siteA/siteA/wsgi.py

    Alias /static/ /var/www/siteA/static/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.siteB.tk
    ServerAlias siteB.tk

    WSGIScriptAlias / /home/me/siteB/siteB/wsgi.py

</VirtualHost>

<VirtualHost *:80>
    ServerName www.siteB.com
    ServerAlias siteB.com

    WSGIScriptAlias / /home/me/siteB/siteB/wsgi.py
</VirtualHost>


<Directory /var/www/siteA/static>
    Order deny,allow
    Allow from all
</Directory>



WSGIPythonPath /home/me/siteA:/home/me/siteB

请帮助,我很害怕,就像我的电脑被一些Apache恶魔所拥有。

3 个答案:

答案 0 :(得分:3)

阅读:

这描述了在Apache / mod_wsgi下运行Django时可以混合网站响应的所有常见原因。

除此之外,如果不小心您的网站共享一个共同的父域,您也可以看到问题。为此,如果每个站点都已设置并且实际上共享相同的cookie,则可能必须调整cookie域或名称。

还要注意为所有站点(例如memcache)共享公共后端服务,因为只要不同的站点使用相同的数据密钥,就会存在争用。对于该设置,要使用不同的memcache密钥前缀来保持数据分离。

答案 1 :(得分:0)

首先,组合相同的网站:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.siteA.tk
    ServerAlias siteA.tk siteA.com www.siteA.com
    WSGIScriptAlias / /home/me/siteA/siteA/wsgi.py
    Alias /static/ /var/www/siteA/static/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.siteB.tk
    ServerAlias siteB.tk siteB.com www.siteB.com

    WSGIScriptAlias / /home/me/siteB/siteB/wsgi.py
</VirtualHost>

此外,不是在Apache配置中使用WSGIPythonPath,而是在wsgi.py文件的开头添加此行(此示例适用于siteA,正确更改为siteB):

import sys
sys.path.append('/home/me/siteA')

答案 2 :(得分:0)

自我实现。

解决方案是更改django生成的wsgi.py文件。事实上,它在评论中明确指出:

# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "siteA.settings"

我使用了简单的选项,并用

替换了注释下面的给定行
os.environ["DJANGO_SETTINGS_MODULE"] = "yoursite.settings"

重启apache

$ apachectl -k graceful

问题解决了。