2012-12-14 63 views
2

我想从使用WSGI的同一服务器提供两个django项目,但要求从example.com/运行一个(我们称之为app1),另一个来自示例.com/foo /(app2)。我试着用Graham的评论here中描述的单独的守护进程来设置它,但是当其中一个路径是另一个路径的子目录时,这似乎不起作用。所有对example.com/foo/...的请求仍然由app1处理。从另一个子路径服务第二个应用程序

有什么办法可以实现我在找的东西,而无需将两个项目合并为一个(这将是一项艰巨的任务)?

这是我目前在我的网站配置:

WSGIDaemonProcess app1 \ 
    python-path=<path for app1's virtualenv> 
WSGIDaemonProcess app2 \ 
    python-path=<path for app2's virtualenv> 
WSGIScriptAlias/<path to app1's wsgi.py> 
WSGIScriptAlias /foo/ <path to app2's wsgi.py> 

<Location /> 
WSGIProcessGroup app1 
</Location> 

<Location /foo/> 
WSGIProcessGroup app2 
</Location> 

更新:

我用LocationMatch替代的位置,试图在每次请求是没有的路径尝试首先将/ foo委托给app1,然后委托给app2,但由于某种原因,这种做法无效。现在,请求/ foo/...导致错误日志中的此行500错误:

mod_wsgi (pid=12032): Exception occurred processing WSGI script '<app1's wsgi.py>'. 

任何想法?

上面已经改变的底部

<LocationMatch "^/(?!foo.*)"> 
WSGIProcessGroup app1 
</LocationMatch> 

<LocationMatch "^/foo.*"> 
WSGIProcessGroup app2 
</LocationMatch> 

更新2:

在错误日志中寻找进一步之后,它看起来像请求/富/ ...正在处理通过app1的wsgi.py文件,但使用app2的python路径,这意味着正在应用正确的WSGIProcessGroup指令。因此,问题似乎是ScriptAlias碰撞。是否有可能使这个别名是一个正则表达式,以确保/ foo ...不匹配/?

+0

这看上去一切正常:

这种特定排序问题进行了说明。你已经三次检查你的路径中的复制粘贴错误,并重新启动Apache两次以获得好的度量? – Enrico

+0

是的,非常确定一切都应该如此,但app1仍然优先(在编辑之前的配置中)。 – Tiki

回答

-2

正则表达式原来是解决方案。 WSGIScriptAliasMatch能够为路径匹配特定的正则表达式,而不仅仅是引起冲突的路径的开始,因为显然,两个路径都以/开头。

对于后人,这里的最终配置:

WSGIDaemonProcess app1 \ 
    python-path=<path for app1's virtualenv> 
WSGIDaemonProcess app2 \ 
    python-path=<path for app2's virtualenv> 
WSGIScriptAliasMatch "^/(?!foo.*)" <path to app1's wsgi.py> 
WSGIScriptAlias /foo <path to app2's wsgi.py> 

<LocationMatch "^/(?!foo.*)"> 
WSGIProcessGroup app1 
</LocationMatch> 

<LocationMatch "^/foo.*"> 
WSGIProcessGroup app2 
</LocationMatch> 
+0

即时有人使用WSGIScriptAliasMatch,这是一个很好的指标,他们不明白应该做什么。看到我的答案。 –

+0

我欣赏帮助,但不是无礼。 – Tiki

+1

我真的很想强调一下,WSGIScriptAliasMatch真的是错误的方法。 mod_wsgi文档不提倡使用WSGIScriptAliasMatch。不幸的是,在那里有一些博客文章建议使用它,尽管几乎总是可以用更简单,更高效的WSGIScriptAlias来做同样的事情。任何评论都不是专门针对你的,但是对于稍后再来看这篇文章的人来说,他们会三思而后行。 –

2

用途:

WSGIDaemonProcess app1 \ 
    python-path=<path for app1's virtualenv> 
WSGIDaemonProcess app2 \ 
    python-path=<path for app2's virtualenv> 

WSGIScriptAlias /foo <path to app2's wsgi.py> 
WSGIScriptAlias/<path to app1's wsgi.py> 


WSGIProcessGroup app1 

<Location /foo> 
WSGIProcessGroup app2 
</Location> 

的WSGIScriptAlias指令的顺序很重要。嵌套最深的URL路径必须首先出现。

+0

我以为我已经试过这个,但也许我没有重新启动apache或其他东西。将再试一次。谢谢! – Tiki

+0

注意到格雷厄姆删除/ foo后面的斜线也很重要。WSGIScriptAlias – Enrico

+0

尾部斜线与原始问题无关。一般来说,我会说没有在子URL上安装WSGI应用程序的尾部斜杠。然后,这允许WSGI应用程序处理它,以决定是否要处理该URL,或者是否要强制执行尾部斜线重定向。通过在WSGIScriptAlias中添加斜杠,可以从WSGI应用程序中取消选择。 –

相关问题