1

我有两个应用程序具有几乎相同的代码库(相同的功能,只是不同的品牌),我正在尝试使用 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 的文本。

然后我禁用了 appB $ sudo a2dissite appB。appB.com 无法加载,但 appA.com 仍在加载 appB 的代码...

我将以下内容添加到appB __init__.py(注意:不是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位于/home/ubuntu/appB_virtualenv/server/appB/appB/__init__.py

另外,我已经禁用了 appB 并且 apache 设置不再引用 appB 的目录,那为什么 appA 还在加载 appB 的脚本?!

我究竟做错了什么?我需要更改哪些设置才能让 appA 将脚本加载到自己的目录中?谢谢


Graham 建议的额外检查

嵌入式或守护程序模式

  • 守护进程模式: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'
  • mod_wsgi.version: (3, 4)
4

1 回答 1

0

乍一看,没有什么是问题。

利用:

确认它们各自在哪个进程和应用程序组中执行。

利用:

查看每个请求中的 SERVER_NAME 设置为什么。

使用结果编辑您的问题。


更新 1

在 Apache 配置中有两个 VirtualHost 的情况下,请求总是以第一个 VirtualHost 结束而永远不会到达第二个的原因是因为没有为 VirtualHost 正在侦听的端口指定 NameVirtualHost 指令。通常在 Linux 上,这对于端口 80 来说不是问题,因为默认情况下它会打开。

它可能发生的另一个原因是 URL 中使用的主机名实际上与所需 VirtualHost 中的 ServerName 或 ServerAlias 不匹配。发生这种情况时,Apache 将回退到将 URL 定向到它在读取 Apache 配置文件时找到的第一个 VirtualHost。为了捕捉这种情况发生的时间,通常最好声明一个默认的 VirtualHost,它首先被读取并拒绝所有访问。至少这样一个请求不会在错误的虚拟主机上结束并且会被阻止。

有关此问题的详细信息,请参阅第一次阅读 VirtualHost,请参阅以下讨论:

尝试定义默认的 VirtualHost 并查看它回退到第一个 VirtualHost 的问题是否是问题。然后您可以检查导致这种情况发生的 Apache 配置的问题。

于 2013-05-20T08:04:10.740 回答