我正在尝试使用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 ...与/?不匹配
答案 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>