在EC2实例的不同子域上运行多个Flask应用
我在亚马逊的EC2服务器上运行着一个用Flask搭建的动态网站。
我不太确定如何在同一个EC2实例上运行不同的网页应用。我看过关于应用调度的资料,这里有个链接:http://flask.pocoo.org/docs/patterns/appdispatch/,还有关于Apache2虚拟主机的资料,这里是链接:http://blog.agdunn.net/?p=162。
我想在这个EC2实例上运行我的主网站www.mydomain.com(这个我已经搞定了),然后再链接到我其他用Flask搭建的应用,比如在www.subdomain.mydomain.com上。
我想知道是否可以通过使用虚拟主机或者在wsgi层面上使用应用调度来实现这个目标?如果可以的话,哪种方式更好呢?
非常感谢大家的帮助和建议。
编辑:感谢回复
目前我正在尝试从主域名domain.co.za
上运行主网站,这个Flask应用存放在var/www/mysite
,同时还想从子域名hello.domain.co.za
上运行另一个应用,这个应用在var/www/flaskhello/flaskhello
里。现在测试的子域名应用只是一个简单的Flask Hello World应用。我已经按照下面的说明设置好了Apache2的配置文件和wsgi文件。
我遇到的问题是,flaskhello应用在domain.co.za
和hello.domain.co.za
上都能显示。似乎var/www/flaskhello/flaskhello/index.wsgi
文件优先于var/www/mysite/index.wsgi
文件,只有我对sys.path.insert...
那一行的修改才会生效。
编辑2
现在我读了这个Google Groups的讨论,它和我想做的事情类似,但使用的是Django。还是没有成功,但让我想知道WSGIApplicationGroup %{GLOBAL}
是否是导致问题的原因。我试着稍微改了一下,但我不太确定自己在做什么,也找不到关于如何在WSGI中使用ApplicationGroups的好文档。
再次感谢大家的帮助。
--
我有以下文件:
etc/apache2/sites-enabled/019-domain.co.za
和etc/apache2/sites-available/domain.co.za
<VirtualHost *:80>
WSGIDaemonProcess index
WSGIScriptAlias / /var/www/mysite/index.wsgi
<Directory /var/www/index>
WSGIProcessGroup index
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
etc/apache2/sites-enabled/018-hello.domain.co.za
和etc/apache2/sites-available/hello.domain.co.za
<VirtualHost *:80>
WSGIScriptAlias / /var/www/flaskhello/flaskhello/index.wsgi
<Directory /var/www/index>
WSGIProcessGroup index
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
var/www/mysite/index.wsgi
import sys
sys.path.insert(0,'/var/www/mysite')
from index import app as application
var/www/flaskhello/flaskhello/index.wsgi
import sys
sys.path.insert(0,'/var/www/flaskhello/flaskhello')
from index import app as application
2 个回答
这完全是可以实现的。如果你打算使用不同的域名,当然需要用到虚拟主机(vhosts)。另外,你可能还想了解一下虚拟环境(virtualenv),这样可以把不同的应用程序的Python环境分开(甚至可以使用LXC容器来提高安全性)。如果你打算使用不同的应用程序,它们会有各自的调度命名空间,所以你需要使用实际的硬链接网址,而不是用url_for作为参数的重定向。这种设置是非常常见的,应该很容易实现。如果你遇到具体的问题,随时跟我们说哦 :)
最后我终于搞定了这个问题
有用的阅读材料: Aagudnn.net 的博客文章 和 Graham 在 Google Groups 的回答。
结果发现我有一个路径设置错了 脸红,而且我还需要在配置文件中设置 ServerName 和 ServerAlias 的部分。此外,我不能给两个不同的 DaemonProcesses 用同样的名字。
现在一切都正常工作了。
这是我最终的配置文件:
<VirtualHost *:80>
ServerName www.domain.co.za
ServerAlias domain.co.za
WSGIDaemonProcess www.domain.co.za
WSGIScriptAlias / /var/www/mysite/index.wsgi
<Directory /var/www/mysite/index>
WSGIProcessGroup index
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
还有
<VirtualHost *:80>
ServerName www.hello.domain.co.za
WSGIDaemonProcess www.hello.domain.co.za
WSGIScriptAlias / /var/www/flaskhello/flaskhello/index.wsgi
<Directory /var/www/flaskhello/flaskhello>
WSGIProcessGroup www.hello.domain.co.za
Order deny,allow
Allow from all
</Directory>
</VirtualHost>