从另一个子路径提供第二个应用程序

时间:2012-12-14 04:57:54

标签: django apache mod-wsgi wsgi

我正在尝试使用WSGI从同一服务器提供两个django项目,但要求从example.com/(让我们调用那个app1)和另一个来自example.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而不是Location来尝试将每个请求都放在一个不以/ 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:

在进一步查看错误日志之后,看起来appl的wsgi.py文件正在处理对/ foo / ...的请求,但使用app2的python路径,这意味着正在应用正确的WSGIProcessGroup指令。因此,问题似乎是ScriptAlias碰撞。是否可以将此别名设为正则表达式以确保/ foo ...与/?不匹配

2 个答案:

答案 0 :(得分: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路径。

此特定排序问题记录在:

答案 1 :(得分:-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>