mod_wsgi从错误的金字塔应用程序目录加载python脚本
我有两个应用程序,它们的代码库几乎相同(功能相同,只是品牌不同),我正试图使用mod_wsgi和apache进行虚拟托管 两个应用程序的虚拟主机设置(在两个单独的文件中)相同(当然路径除外)mod_wsgi从错误的金字塔应用程序目录加载python脚本,python,python-2.7,apache2,mod-wsgi,pyramid,Python,Python 2.7,Apache2,Mod Wsgi,Pyramid,我有两个应用程序,它们的代码库几乎相同(功能相同,只是品牌不同),我正试图使用mod_wsgi和apache进行虚拟托管 两个应用程序的虚拟主机设置(在两个单独的文件中)相同(当然路径除外) appB.wsgi的内容 import os os.environ['PYTHON_EGG_CACHE'] = '/home/ubuntu/appA_virtualenv/appA-server/python-eggs' from pyramid.paster import get_app, setup_
appB.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')
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脚本。我通过在两个应用程序的\uuuuu init\uuuuuuuuy.py
中添加print
语句来确认这一点,并且即使在我尝试访问appA时,也会打印appB的文本
然后我通过$sudo a2dispatite appB
禁用了appB。appB.com无法加载,但appA.com仍在加载appB的代码
我将以下内容添加到appB\uuuu init\uuuu.py
(注意:非appA)
输出为
/home/ubuntu/appA_virtualenv/lib/python2.7/site-packages/pip-1.2.1-py2.7.egg
/home/ubuntu/appA_virtualenv/appA-server/appA
这超出了我的理解,因为输出正确地指向了appA的目录,但是打印文件被添加到了appB的\uuuu init\uuuuuuuuuuuuuuuuy.py
,它位于/home/ubuntu/appB\u virtualenv/server/appB/appB/\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuy.py
另外,我已经禁用了appB,apache设置不再在任何地方引用appB的目录,那么为什么appA仍在加载appB的脚本
我做错了什么?我需要更改哪些设置才能让appA在其自己的目录中加载脚本?谢谢
格雷厄姆建议的额外检查
- 守护程序模式:
mod\u wsgi.process\u group='appA'
- 主解释器:
mod\u wsgi.application\u group=''
PATH\u翻译为:'/home/ubuntu/appA\u virtualenv/appA server/appA.wsgi/'
服务器名称:“appA.com”
SCRIPT\u文件名:'/home/ubuntu/appA\u virtualenv/appA server/appA.wsgi'
mod\u wsgi.application\u组:'
mod\u wsgi.process\u组:“appA”
mod_wsgi.version:(3,4)
乍一看,什么都不是问题
使用:
确认它们各自在哪个进程和应用程序组中执行
使用:
查看为每个in请求设置的服务器名称
用结果编辑您的问题
更新1
在Apache配置中有两个VirtualHost的情况下,请求总是在第一个VirtualHost处结束而从未到达第二个VirtualHost的原因之一是没有为VirtualHost侦听的端口指定NameVirtualHost指令。通常在Linux上,这对于端口80来说不是问题,因为默认情况下它是打开的
发生这种情况的另一个原因是URL中使用的主机名实际上与所需VirtualHost中的ServerName或ServerAlias都不匹配。当这种情况发生时,Apache将回退,将URL定向到读取Apache配置文件时找到的第一个VirtualHost。要捕获何时发生这种情况,通常最好声明一个默认的VirtualHost,它首先被读取,并且拒绝所有访问。至少这样,请求不会在错误的虚拟主机上结束,并且会被阻止
有关此问题的详细信息,请返回到first read VirtualHost,请参阅中的讨论:
尝试定义默认的VirtualHost,看看它是否会退回到第一个VirtualHost。然后您可以了解Apache配置的问题是什么导致了这种情况的发生。我已将结果添加到问题的末尾。非常感谢你的帮助
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')
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