好的,所以我必须使用现有的服务器来运行我的 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。