在Ubuntu中运行多个独立的Flask应用程序

时间:2015-04-26 19:41:08

标签: apache ubuntu flask virtualenv

我正在尝试使用Apache在单独的虚拟目录中运行两个或更多Flask应用程序,例如 / var / www / myapps / app1 http://localhost/site1的{​​{1}} 的/ var / WWW /安装MyApps / APP2 。每个应用程序在 env 目录下都有自己的虚拟环境。

我开始使用Apache2(v2.4.7)全新安装Ubuntu 14.04,使用http://localhost/site2删除了默认站点配置,并添加了我的两个应用程序的配置。

以下是 /etc/apache2/sites-available/app1.conf 中app1的conf文件。 app2的配置相同,取代sudo a2dissite 000-default app2app1取代site2。)

site1

然后我使用<VirtualHost *:80> ServerName localhost WSGIProcessGroup site1 WSGIDaemonProcess site1 user=myserviceuser group=myserviceuser threads=5 python-path=/var/www/myapps/app1:/var/www/myapps/app1/env/lib/python2.7/site-packages WSGIScriptAlias /site1 /var/www/myapps/app1/application.wsgi WSGIScriptReloading On <Directory /var/www/mysites/app1> WSGIApplicationGroup site1 Order deny,allow Allow from all </Directory> </VirtualHost> (和app2)启用了每个网站,然后使用sudo a2ensite app1重新启动了服务器。

这些应用中的每一个在根目录中都有以下sudo apache2ctl restart文件:

application.wsgi

其中一个网站运行正常,当我点击它时用正确的页面做出响应。另一个给了我一个Apache 404页面。 conf文件中没有拼写错误。

似乎应用程序的配置互相破坏,其中一个是“获胜”。我花了很多时间调整配置,但我能使其工作的唯一方法是将 localhost2 添加到我的 hosts 文件并更改{{1}在其中一个应用程序配置中# put a copy of this file in the root dir of each app instance import os, sys # activate the virtual environment app_dir = os.path.dirname(__file__) # removed next two lines after a comment left below # activate_this = os.path.join(app_dir, 'env', 'bin', 'activate_this.py') # execfile(activate_this, dict(__file__=activate_this)) sys.path.insert(0, app_dir) from myapp import app as application ,这在我的情况下是不可取的。有人能指出我配置Apache的正确方法吗?或者我对此采取了错误的方式?

理想情况下,我希望配置文件不关心使用哪个主机名来访问它们,可能会成为在负载均衡器后面运行的此服务器的多个副本。

1 个答案:

答案 0 :(得分:5)

我花了更多时间在这上面,如果我开始更好地理解Apache术语和配置,我就不能将虚拟主机用于此目的。 VirtualHost部分用于提供不同的主机名(多个域或子域)。

为了将并行应用程序配置为子目录,我可以使用Directory部分。我也没有意识到配置文件中的某些WSGI*指令可能会出现多次。这个新知识允许我生成以下单个配置文件,它可以完成我想要的任务。因此,不是为每个应用程序启用一个Apache站点,而是可以启用一个包含其中配置目录的站点。

# this goes in /etc/apache2/sites-available/
<VirtualHost *:80>
    ServerName localhost

    # logs configuration
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    WSGIDaemonProcess site1 user=myserviceuser group=myserviceuser threads=5 python-home=/var/www/myapps/app1:/var/www/myapps/app1/env/lib/python2.7/site-packages
    WSGIScriptAlias /site1 /var/www/myapps/app1/application.wsgi
    <Directory /var/www/myapps/app1>
        WSGIApplicationGroup site1
        WSGIProcessGroup site1
        Order deny,allow
        Allow from all
    </Directory>

    WSGIDaemonProcess site2 user=myserviceuser group=myserviceuser threads=5 python-home=/var/www/myapps/app2:/var/www/myapps/app2/env/lib/python2.7/site-packages
    WSGIScriptAlias /site2 /var/www/myapps/app2/application.wsgi
    <Directory /var/www/myapps/app2>
        WSGIApplicationGroup site2
        WSGIProcessGroup site2
        Order deny,allow
        Allow from all
    </Directory>

</VirtualHost>

修改

我后来提到了Graham Dumpleton的建议,并从 application.wsgi 中删除了activate_this内容,并将WSGIDaemonProcess指令行更改为:

WSGIDaemonProcess site1 user=myserviceuser group=myserviceuser threads=5 python-home=/var/www/myapps/app1/env