我正在尝试使用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
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>
(和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的正确方法吗?或者我对此采取了错误的方式?
理想情况下,我希望配置文件不关心使用哪个主机名来访问它们,可能会成为在负载均衡器后面运行的此服务器的多个副本。
答案 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