在EC2实例的不同子域上运行多个Flask应用

3 投票
2 回答
3094 浏览
提问于 2025-04-17 13:35

我在亚马逊的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.zahello.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.zaetc/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.zaetc/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 个回答

1

这完全是可以实现的。如果你打算使用不同的域名,当然需要用到虚拟主机(vhosts)。另外,你可能还想了解一下虚拟环境(virtualenv),这样可以把不同的应用程序的Python环境分开(甚至可以使用LXC容器来提高安全性)。如果你打算使用不同的应用程序,它们会有各自的调度命名空间,所以你需要使用实际的硬链接网址,而不是用url_for作为参数的重定向。这种设置是非常常见的,应该很容易实现。如果你遇到具体的问题,随时跟我们说哦 :)

2

最后我终于搞定了这个问题
有用的阅读材料: 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>

撰写回答