在 Apache for Django 上运行 Mod_Python 和 Mod_WSGI——分段错误(11)

在 Apache for Django 上运行 Mod_Python 和 Mod_WSGI——分段错误(11)

好的,所以我必须使用现有的服务器来运行我的 Django Web 应用程序。该服务器运行的是 Mac OS 10.6 Server。它预装了 Python 2.3、2.5 和 2.6。我已编辑 http.conf 文件以包含以下内容:

# Force python to run in main interpreter
WSGIApplicationGroup %{GLOBAL}

# Need the wsgi module to start django up, so point to the python file that will do that.
WSGIScriptAlias /webapp/ "/WebSites/django/webapp/apache/django.wsgi"

<Directory "/WebSites/django/webapp/apache/django.wsgi">
    Order deny,allow
    Allow from all
</Directory>

mod_python 和 mod_wsgi 肯定都被 Apache 加载了。证明:

$ apachectl -t -D DUMP_MODULES
Loaded Modules:
core_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)

...

auth_user_host_apple_module (shared)
auth_session_apple_module (shared)
python_module (shared)
php5_module (shared)
wsgi_module (shared)
passenger_module (shared)
Syntax OK

当 Apache 服务器启动时,我的 django.wsgi python 文件就会运行:

import os

import sys

path = '/WebSites/django/webapp'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'webapp.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

因此当apache服务器运行时,apache错误日志中会输出以下内容:

[Wed Aug 04 11:39:19 2010] [notice] mod_python: Creating 8 session mutexes based on 1024 max processes and 0 max threads.
[Wed Aug 04 11:39:19 2010] [notice] mod_python: using mutex_directory /tmp 
[Wed Aug 04 11:39:19 2010] [notice] Apache/2.2.14 (Unix) DAV/2 SVN/1.6.5 mod_python/3.3.1 Python/2.4.6 PHP/5.3.2 mod_wsgi/3.3 Python/2.6.1 Phusion_Passenger/2.2.11 configured -- resuming normal operations

一切看起来都很好,直到我转到浏览器中的 URL:

[Wed Aug 04 11:42:13 2010] [error] 2.6.1 (r261:67515, Feb 11 2010, 00:51:29) 
[Wed Aug 04 11:42:13 2010] [error] [GCC 4.2.1 (Apple Inc. build 5646)]
[Wed Aug 04 11:42:15 2010] [notice] child pid 78097 exit signal Segmentation fault (11)

好吧,我遇到了分段错误。我在 Google 上搜索了一下,找到了这个http://code.google.com/p/modwsgi/wiki/InstallationIssues#Using_ModPython_and_ModWsgi这很棒,因为它准确地描述了我的问题。它指示我 1. 使用 --enable-shared 编译 python 或 2. 重新编译 mod_wsgi。我不愿意编译 python,因为它在 Mac OS 10.6 Server 上是预装的。

所以我选择了第二个选项。我运行./configure,然后按照提示打开 makefile 并查找该行,LDLIBS = -lpython2.3 -lpthread -ldl -lutil但我找不到它。我能找到的最接近的行是,LDLIBS = -ldl但如果它不存在,我显然无法删除它-lpython。(我很确定这些文档适用于旧版本的 mod_wsgi。)我在 makefile 中搜索,-lpython但什么也没找到。

有人知道如何编译 mod_wsgi 3.3 以便“Python 库实际上并未与 mod_wsgi 模块链接。”??

同样,这是否意味着 mod_wsgi 将使用 Python 2.6 或 mod_python 显然使用的旧版本?

非常感谢你的帮助!

根据 Graham Dumpleton 的要求进行更新:

$ otool -L mod_python.so
mod_python.so:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.1)
$ otool -L mod_wsgi.so
mod_wsgi.so:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.0)
    /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)

答案1

您的 mod_python 和 mod_wsgi 使用不同的版本。这是核心问题,因为它们必须使用相同的版本。它们是否使用共享库是次要问题,在 MacOS X 上通常不是问题,除非您使用未正确配置的手工构建 Python。

跑步:

otool -L mod_python.so
otool -L mod_wsgi.so

确定每个 Python 依赖项以及是否使用共享库,并使用该输出更新问题。然后可以建议下一步。

总而言之,强烈建议不要同时使用 mod_python 和 mod_wsgi,理想情况下应该完全放弃 mod_python 并将应用程序迁移到基于 WSGI 的解决方案。

而且,根本不存在 MacOS 1.6。

相关内容