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

Run multiple independent Flask apps in Ubuntu

我正在尝试 运行 使用 Apache 在单独的虚拟目录中 http://localhost/site1 两个或多个 Flask 应用程序,例如 /var/www/myapps/app1http://localhost/site2 对于 /var/www/myapps/app2。每个应用程序在 env 目录下都有自己的虚拟环境。

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

这是位于 /etc/apache2/sites-available/app1.conf 的 app1 的配置文件。 app2 的配置相同,将 app2 替换为 app1(将 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>

然后我使用 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

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

应用程序的配置似乎相互干扰,一个是 "winning." 我花了很多时间调整配置,但唯一能让它工作的方法是添加 localhost2 到我的 hosts 文件,并在其中一个应用程序配置中将 ServerName 更改为 localhost2,这在我的情况。有人可以指出配置 Apache 的正确方法吗?还是我走错了路?

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

我在这上面花了更多时间,如果我开始更好地理解 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