【问题标题】:Weird, inconsistent behavior using Apache and multiple Django sites使用 Apache 和多个 Django 站点的奇怪、不一致的行为
【发布时间】:2013-10-26 06:22:01
【问题描述】:

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

这变得非常令人困惑,因为这种行为是完全不可预测的。我关注了站点 A 上的一些内部链接,突然间,出现了来自站点 B 的 404 error(当然,该 url 无法在站点 B 的 url 中解析,因为它是来自站点 A 的 url)。我可以在不更改 url 的情况下刷新页面,然后它会突然返回站点 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 恶魔附身了。

【问题讨论】:

  • 我认为您需要为WSGIScriptAlias 中的每个站点使用不同的路径。喜欢WSGIScriptAlias /siteAtk /home/me/siteA/siteA/wsgi.py 为 www.siteA.tk
  • 还是同样的问题,用这个方法也不能在root地址下运行

标签: python django apache mod-wsgi


【解决方案1】:

去阅读:

这描述了在 Apache/mod_wsgi 下运行 Django 时,您可能会得到站点响应混合的所有常见原因。

除此之外,如果您的网站共享一个共同的父域,如果不小心,您也会发现问题。为此,如果每个站点都已设置并且有效地共享相同的 cookie,您可能需要调整 cookie 域或名称。

还要注意共享所有站点(例如 memcache)的通用后端服务,因为不同站点使用相同的数据键可能会发生争用。对于该设置,使用不同的 memcache 键前缀来保持数据分离。

【讨论】:

    【解决方案2】:

    首先,像这样组合相同的网站:

    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 文件的开头添加这一行(此示例适用于站点 A,为站点 B 适当更改):

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

    【讨论】:

    • 非常好的提示,谢谢。但是,它不会解决我遇到的问题,我确实找到了解决方案。我仍在等待 8 小时,然后才被允许回答我自己的问题。
    【解决方案3】:

    自我实现。

    解决方案是更改 django 生成的 wsgi.py 文件。事实上,它在 cmets 中明确表示:

    # 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
    

    问题解决了。

    【讨论】:

      猜你喜欢
      • 2013-11-15
      • 2012-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 2010-12-23
      • 2014-07-25
      相关资源
      最近更新 更多