Apache-2.2

在 Apache 上為 Django 執行帶有 Mod_WSGI 的 Mod_Python – 分段錯誤 (11)

  • August 5, 2010

好的,所以我必須使用現有的伺服器來執行我的 Django Web 應用程序。伺服器正在執行 Mac OS 10.6 伺服器。它預裝了 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)

好的,所以我遇到了分段錯誤。我四處搜尋,發現這個http://code.google.com/p/modwsgi/wiki/InstallationIssues#Using_ModPython_and_ModWsgi很棒,因為它準確地描述了我的問題。它指示我 1. 使用 –enable-shared 編譯 python 或 2. 重新編譯 mod_wsgi。我不願意編譯 python,因為它預裝在 Mac OS 10.6 伺服器上。

所以我選擇了第二個選項。我執行./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)

您的 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 這樣的東西。

引用自:https://serverfault.com/questions/167069