mod_wsgi从错误的Pyramid app目录加载python脚本

时间:2013-05-20 06:26:45

标签: python python-2.7 apache2 mod-wsgi pyramid

我有两个应用程序具有几乎相同的代码库(功能相同,只是品牌不同),我尝试使用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在自己的目录中加载脚本?感谢


格雷厄姆建议的额外检查

Embedded or Daemon Mode

  • 守护程序模式:mod_wsgi.process_group = 'appA'

Sub Interpreter Being Used

  • 主要翻译:{{1​​}}

Request Environment

  • 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'

1 个答案:

答案 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配置的问题。