在 Apache 上為 Django 執行帶有 Mod_WSGI 的 Mod_Python – 分段錯誤 (11)
好的,所以我必須使用現有的伺服器來執行我的 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 這樣的東西。