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

ser*_*ira 2 apache ubuntu virtualenv flask

我试图与Apache运行在单独的虚拟目录的两个或更多瓶的应用,如http://localhost/site1用于在/ var / WWW /安装MyApps / APP1http://localhost/site2用于在/ var / WWW /安装MyApps / APP 2。每个应用程序在env目录下都有自己的虚拟环境。

我首先使用Apache2(v2.4.7)重新安装了Ubuntu 14.04,然后删除了默认站点配置,sudo a2dissite 000-default并为两个应用程序添加了配置。

这是app1的conf文件,位于/etc/apache2/sites-available/app1.conf。为APP2的cofiguration是相同的,替换app2app1(和site2site1)。

<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>
Run Code Online (Sandbox Code Playgroud)

然后,我使用sudo a2ensite app1(和app2)启用了每个站点,然后使用重启了服务器sudo apache2ctl restart

这些应用程序的每个application.wsgi在根目录中都有以下文件:

# 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
Run Code Online (Sandbox Code Playgroud)

发生的情况是,其中一个站点运行良好,当我点击它时会以正确的页面进行响应。另一个给了我一个Apache 404页面。conf文件中没有错别字。

这些应用程序的配置似乎互相干扰,一个正在“取胜”。我花了很多时间调整的配置,但唯一的办法我可以使它工作是,如果我加入localhost2到我的主机文件,并改变ServerNamelocalhost2在应用的configs,这是不可取的在我的案件之一。有人可以指出我配置Apache的正确方法吗?还是我走错路了?

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

ser*_*ira 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>
Run Code Online (Sandbox Code Playgroud)

编辑:

后来我遵循了Graham Dumpleton的建议,并activate_thisapplication.wsgi中删除了这些内容,并将WSGIDaemonProcess指令行更改为:

WSGIDaemonProcess site1 user=myserviceuser group=myserviceuser threads=5 python-home=/var/www/myapps/app1/env
Run Code Online (Sandbox Code Playgroud)