24

我想在同一主机上部署两个不同的 django 应用程序:第一个对应 url /site1,第二个对应 url /site2。这是我的配置:

LoadModule wsgi_module 模块/mod_wsgi.so

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py

WSGIPythonPath /var/www/py/site1:/var/www/py/site2

<目录“/var/www/py/site1/site1”>
<文件 wsgi.py>
订单拒绝,允许
允许所有人
</文件>
</目录>

<目录“/var/www/py/site2/site2”>
<文件 wsgi.py>
订单拒绝,允许
允许所有人
</文件>
</目录>

这也是两个应用程序的 wsgi.py 文件

导入操作系统
导入系统

路径 = '/var/www/py/site1'
如果路径不在 sys.path 中:
    sys.path.append(路径)

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings")
从 django.core.wsgi 导入 get_wsgi_application
应用程序 = get_wsgi_application()

现在,这是我的问题。当我访问我的服务器时,假设http://app1.sites.gr/site1有时会加载 site1,有时会加载 site2 !!!当我访问 http://app1.sites.gr/site2时也是如此......有时我会看到 site1 的欢迎页面,有时我会看到 site2 的欢迎页面!我正在按 F5 并获得不同的欢迎页面。我已经检查了前几个小时的所有内容,没有发现任何奇怪的东西......

请在我发疯之前告诉我可能是什么问题......

谢谢 !

4

3 回答 3

51

这是 Django 1.4 生成的 wsgi.py 文件的问题。如果尝试在同一进程中托管两个不同的 Django 实例,即使在单独的子解释器中,它也不起作用。

改变:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "site1.settings")

至:

os.environ["DJANGO_SETTINGS_MODULE"] = "site1.settings"

或者更好的是仍然使用守护进程模式并将每个委托在不同的守护进程组中运行。

也就是说,而不是:

WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py
WSGIScriptAlias /site2 /var/www/py/site2/site2/wsgi.py

WSGIPythonPath /var/www/py/site1:/var/www/py/site2

利用:

WSGIDaemonProcess site1 python-path=/var/www/py/site1
WSGIScriptAlias /site1 /var/www/py/site1/site1/wsgi.py process-group=site1 application-group=%{GLOBAL}

WSGIDaemonProcess site2 python-path=/var/www/py/site2
WSGIScriptAlias /site2 /var/www/py/site1/site2/wsgi.py process-group=site2 application-group=%{GLOBAL}

更新

请注意,现在有一篇关于此和其他原因的完整博客文章。

于 2012-07-17T03:27:48.043 回答
1

您的应用程序在同一个端口上侦听,并且似乎没有将它们委托给不同端口的代理。

您要么必须在 apache 中设置 VirtualHosts,要么使用 Nginx、lighttpd 或其他东西来创建适当的代理

于 2012-07-16T13:55:34.170 回答
1

Graham Dumpleton 的回复可能是您最想阅读的回复,但我建议通过将您的两个 Django 托管在不同子域的根目录而不是同一域的非根位置来节省很多胃灼热。恕我直言,运行非根 Django 站点有很多陷阱。

祝你好运!

于 2012-07-17T03:48:39.467 回答