【问题标题】:Run multiple independent Flask apps in Ubuntu在 Ubuntu 中运行多个独立的 Flask 应用程序
【发布时间】:2015-07-05 03:06:01
【问题描述】:

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

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

这是 /etc/apache2/sites-available/app1.conf 中 app1 的 conf 文件。 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文件中没有错别字。

似乎应用程序的配置相互冲突,其中一个正在“获胜”。我花了很多时间来调整配置,但我可以让它工作的唯一方法是如果我将 localhost2 添加到我的 hosts 文件并将ServerName 更改为localhost2 在其中一个应用程序配置中,这在我的情况下是不可取的。有人可以指出配置 Apache 的正确方法吗?还是我走错了路?

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

【问题讨论】:

    标签: apache ubuntu flask virtualenv


    【解决方案1】:

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

    【讨论】:

    • 你不需要'WSGIScriptReloading On'。这是默认设置。最好使用 python-home 选项来指定任何 Python 虚拟环境的位置,而不是 python-path。 blog.dscpl.com.au/2014/09/…blog.dscpl.com.au/2014/09/…
    • @GrahamDumpleton 感谢您的链接。我更新了我的代码,一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2021-01-25
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多