使用 mod_wsgi 在 Apache 上部署多个 django 应用程序

Posted

技术标签:

【中文标题】使用 mod_wsgi 在 Apache 上部署多个 django 应用程序【英文标题】:Deploying multiple django apps on Apache with mod_wsgi 【发布时间】:2012-07-15 09:00:45 【问题描述】:

我想在同一主机上部署两个不同的 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 订单拒绝,允许 允许所有人 文件> 目录> 订单拒绝,允许 允许所有人 文件> 目录>

这也是两个应用程序的 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 并获得不同的欢迎页面。我已经检查了前几个小时的所有内容,没有发现任何奇怪的东西......

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

谢谢!

【问题讨论】:

【参考方案1】:

这是 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

更新

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

http://blog.dscpl.com.au/2012/10/requests-running-in-wrong-django.html

【讨论】:

这确实有效,谢谢!但是我现在有另一个问题:当我尝试在同一个浏览器中访问两个站点时,它有时会从 site2 注销我(当我访问 site1 时)-但不是相反...这可能是因为我有 /site1 和 /站点2?我应该尝试 Erik 的建议并拥有 site1.sites.gr 和 site2.sites.gr 吗? 您需要为每个站点设置不同的 SESSION_COOKIE_NAME 或 SESSION_COOKIE_PATH,因为它们在同一个域下。见code.google.com/p/modwsgi/wiki/IntegrationWithDjango【参考方案2】:

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

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

【讨论】:

我不能通过不同的 url (site1 vs site2) 委托给正确的脚本吗????我不想使用不同的端口或配置代理!我只想在同一个 apache 主机上运行两个 django 应用程序 - 我在其他地方读到这是可能的 :( 那么我是否应该在不同的端口上使用 gunicorn 运行我的两个站点,然后在我的 httpd.conf 上为两个站点添加以下“ProxyPass /site1 127.0.0.1:8111 ProxyPassReverse /site1 127.0.0.1:8111”? 我以为你只是想使用 apache,在这种情况下使用 VirtualHosts httpd.apache.org/docs/2.2/vhosts/examples.html 好吧,我真正想做的就是我的要求...拥有sites.gr/site1和sites.gr/site2 - 每个都指向自己的django应用程序...但是据我所知是不可能的:( 使用虚拟主机的 apache 完全有可能我什至给你发了一个例子,只需要一些关于静态文件和 wsgi 分配的额外设置【参考方案3】:

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

祝你好运!

【讨论】:

好吧,经过大约 8 个月(不是重度)的生产使用,四个不同的站点(/site1、/site2、site3 和 site4),一切都运行得非常好(是的,甚至与SESSION_COOKIE_NAME 设置)!唯一要记住的是永远不要使用绝对网址,而只能通过 revese 和 % url % - 毕竟这是 django-DRY-way :)

以上是关于使用 mod_wsgi 在 Apache 上部署多个 django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 mod_wsgi 在 Ubuntu 16.04 apache2 上部署 Django 应用程序

Win7环境下Apache+mod_wsgi本地部署Django

'使用mod_wsgi在apache上部署django app时,没有名为'encodings''的模块

使用 DotCloud 使用 apache + mod_wsgi + postgresql + nginx + memchache 部署 Django 应用程序

Apache mod_wsgi 在部署 Django 项目时抛出错误“403 Forbidden”

在windows上用apache+mod_wsgi服务部署django项目