一个 Django 实例下的多个站点 - 站点有时会提供错误的内容

Posted

技术标签:

【中文标题】一个 Django 实例下的多个站点 - 站点有时会提供错误的内容【英文标题】:Multiple sites under one Django instance - Sites serve wrong content sometimes 【发布时间】:2013-05-22 08:07:23 【问题描述】:

我的 django 配置有一个奇怪的问题。我在一个 django 项目目录下运行了三个类似的站点。我用 apache virtualhost 将它们分开。它在大多数情况下运行良好,但有时不知何故在另一个域的一个域内容下。

例如 domain.cz 伪装成 www.microsite.cz。所以两个域下有相同的内容。或者 domain.sk 伪装成 domain.cz。它是随机发生的,很难调试。通常我可以从谷歌网站管理员工具中看到它。重启 apache 后一切正常。

有谁知道什么会导致这种奇怪的行为?

这是我的配置httpd.conf:

ServerRoot "/home/me/webapps/domain/apache2"

LoadModule dir_module        modules/mod_dir.so
LoadModule env_module        modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module       modules/mod_mime.so
LoadModule rewrite_module    modules/mod_rewrite.so
LoadModule setenvif_module   modules/mod_setenvif.so
LoadModule wsgi_module       modules/mod_wsgi.so

LogFormat "%X-Forwarded-Fori %l %u %t \"%r\" %>s %b \"%Refereri\" \"%User-Agenti\"" combined
KeepAlive Off
Listen 53696
SetEnvIf X-Forwarded-SSL on HTTPS=1


MaxSpareThreads 10
MinSpareThreads 2
ServerLimit 3
ThreadsPerChild 10

WSGIPythonPath /home/me/webapps/domain:/home/me/webapps/domain/lib/python2.6/site-packages


NameVirtualHost *
<VirtualHost *>
    ServerName domain.cz
    ServerAlias www.domain.cz

    CustomLog /home/me/logs/user/domain/access_com.log combined
    ErrorLog /home/me/logs/user/domain/error_com.log

    WSGIDaemonProcess domain_cz processes=3 python-path=/home/me/webapps/domain:/home/me/webapps/domain/lib/python2.6 threads=2
    WSGIScriptAlias / /home/me/webapps/domain/apache2/conf/cz.wsgi

    RewriteEngine on
    RewriteCond %HTTP_HOST ^www.domain\.cz$ [NC]
    RewriteRule ^/(.*)$ http://domain1.cz/$1 [R=301]
</VirtualHost>

<VirtualHost *>
    ServerName domain.sk
    ServerAlias www.domain.sk

    CustomLog /home/me/logs/user/domain/access_sk.log combined
    ErrorLog /home/me/logs/user/domain/error_sk.log

    WSGIDaemonProcess domain_sk python-path=/home/me/webapps/domain:/home/me/webapps/domain/lib/python2.6 threads=3
    WSGIScriptAlias / /home/me/webapps/domain/apache2/conf/sk.wsgi

    RewriteEngine on
    RewriteCond %HTTP_HOST slavne-domain\.sk$ [NC,OR]
    RewriteCond %HTTP_HOST slavnedomain\.sk$ [NC,OR]
    RewriteCond %HTTP_HOST ^www\.domain\.in$ [NC]
    RewriteRule ^/(.*)$ http://domain.in/$1 [R=301]
</VirtualHost>

<VirtualHost *>
    ServerName www.microsite.cz
    ServerAlias microsite.cz

    CustomLog /home/me/logs/user/domain/access_cz_laska.log combined
    ErrorLog /home/me/logs/user/domain/error_cz_laska.log

    WSGIDaemonProcess domain_cz_micro python-path=/home/me/webapps/domain:/home/me/webapps/domain/lib/python2.6 threads=3
    WSGIScriptAlias / /home/me/webapps/domain/apache2/conf/cz_micro.wsgi

    RewriteEngine on
    RewriteCond %HTTP_HOST ^domain-o-lasce\.net$ [NC]
    RewriteRule ^/(.*)$ http://www.domain-o-lasce.net/$1 [R=301]
</VirtualHost>

这是我的 wsgi 脚本的示例:

import os
import sys

from django.core.handlers.wsgi import WSGIHandler

os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings.cz'
# or domain.settings.sk or domain.settings.cz_micro 

application = WSGIHandler()

【问题讨论】:

【参考方案1】:

您缺少 WSGIProcessGroup 指令。去阅读:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Embedded_Or_Daemon_Mode http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html

您的单独应用程序并未像您想象的那样在单独的进程中运行。

【讨论】:

以上是关于一个 Django 实例下的多个站点 - 站点有时会提供错误的内容的主要内容,如果未能解决你的问题,请参考以下文章

Django上的多个站点

django cms 搜索多个站点?

django 管理站点的两个实例 - 模板

通过 Gunicorn/Nginx 使用 Django 的站点框架运行多个站点

使用 apache mod_wsgi 的 Django 多个站点:请求到错误的站点

如何在由“站点”框架提供支持的多个 Django 站点中获取唯一用户?