我有两个应用程序具有几乎相同的代码库(功能相同,只是品牌不同),我尝试使用mod_wsgi和apache进行虚拟主机托管。
两个应用程序的虚拟主机设置(在两个单独的文件中)是相同的(当然路径除外)
WSGIPythonHome /home/ubuntu/BASELINE
<VirtualHost *:80>
ServerName appA.com
ServerAlias www.appA.com
ServerAdmin admin@appA.com
DocumentRoot /home/ubuntu/appA_virtualenv/appA-server/appA
ErrorLog /home/ubuntu/appA_virtualenv/appA-server/error.log
CustomLog /home/ubuntu/appA_virtualenv/appA-server/access.log combined
Alias /static/ /home/ubuntu/appA_virtualenv/appA-server/appA/appA/static/
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess appA user=www-data group=www-data \
python-path=/home/ubuntu/appA_virtualenv/lib/python2.7/site-packages/ \
home=/home/ubuntu/appA_virtualenv/appA-server/appA/
WSGIProcessGroup appA
WSGIScriptAlias / /home/ubuntu/appA_virtualenv/appA-server/appA.wsgi
<Directory /home/ubuntu/appA_virtualenv/appA-server>
WSGIProcessGroup appA
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
。
<VirtualHost *:80>
ServerName appB.com
ServerAlias www.appB.com
ServerAdmin admin@appB.com
DocumentRoot /home/ubuntu/appB_virtualenv/server/appB
ErrorLog /home/ubuntu/appB_virtualenv/server/error.log
CustomLog /home/ubuntu/appB_virtualenv/server/access.log combined
Alias /static/ /home/ubuntu/appB_virtualenv/server/appB/appB/static/
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess appB user=www-data group=www-data \
python-path=/home/ubuntu/appB_virtualenv/lib/python2.7/site-packages/ \
home=/home/ubuntu/appB_virtualenv/server/appB/
WSGIProcessGroup appB
WSGIScriptAlias / /home/ubuntu/appB_virtualenv/server/appB.wsgi
<Directory /home/ubuntu/appB_virtualenv/server>
WSGIProcessGroup appB
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
appA.wsgi
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/ubuntu/appA_virtualenv/appA-server/python-eggs'
from pyramid.paster import get_app, setup_logging
ini_path = '/home/ubuntu/appA_virtualenv/appA-server/appA/development.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')
appB.wsgi
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/ubuntu/appB_virtualenv/server/python-eggs'
from pyramid.paster import get_app, setup_logging
ini_path = '/home/ubuntu/appB_virtualenv/server/appB/development.ini'
setup_logging(ini_path)
application = get_app(ini_path, 'main')
我在apache中启用了两个站点,并意识到在访问appA时,会加载appB目录中的python脚本。我通过在两个应用的print
中添加__init__.py
语句来确认这一点,即使我尝试访问appA,也会打印appB的文本。
然后我按$ sudo a2dissite appB
禁用appB。 appB.com无法加载,但appA.com仍在加载appB的代码......
我将以下内容添加到 appB __init__.py
(注意:NOT appA )
print sys.path[0]
print os.getcwd()
输出
/home/ubuntu/appA_virtualenv/lib/python2.7/site-packages/pip-1.2.1-py2.7.egg
/home/ubuntu/appA_virtualenv/appA-server/appA
这是我无法理解的,因为输出正确指向了appA的目录,而print
被添加到位于__init__.py
的appB的/home/ubuntu/appB_virtualenv/server/appB/appB/__init__.py
另外,我已经禁用了appB,apache设置不再再引用appB的目录,为什么appA仍在加载appB的脚本?!
我做错了什么?我需要更改哪些设置才能让appA在自己的目录中加载脚本?感谢格雷厄姆建议的额外检查
mod_wsgi.process_group = 'appA'
mod_wsgi.application_group = ''
PATH_TRANSLATED: '/home/ubuntu/appA_virtualenv/appA-server/appA.wsgi/'
SERVER_NAME: 'appA.com'
SCRIPT_FILENAME: '/home/ubuntu/appA_virtualenv/appA-server/appA.wsgi'
mod_wsgi.application_group: ''
mod_wsgi.process_group: 'appA'
答案 0 :(得分:0)
乍一看似乎没什么问题。
使用:
确认他们正在执行的流程和应用程序组。
使用:
查看每个请求中SERVER_NAME的设置。
使用结果修改您的问题。
更新1
如果Apache配置中有两个VirtualHost,请求总是在第一个VirtualHost结束并且永远不会到达第二个的一个原因是因为没有为VirtualHost正在侦听的端口指定NameVirtualHost指令。通常在Linux上,这对于端口80来说不是问题,因为默认情况下它会打开。
它可能发生的另一个原因是因为URL中使用的主机名实际上与所需VirtualHost中的ServerName或ServerAlias不匹配。当发生这种情况时,Apache将回退以将URL定向到读取Apache配置文件时找到的第一个VirtualHost。要捕获何时发生这种情况,通常最好声明一个默认的VirtualHost,它首先被读取并拒绝所有访问。至少这种方式,请求不会以错误的VirtualHost结束,并且会被阻止。
有关此问题的详细信息,请回到第一次阅读VirtualHost,请参阅以下讨论:
尝试定义默认的VirtualHost,看看它是否会回到第一个VirtualHost这个问题。然后,您可以解决导致发生这种情况的Apache配置的问题。