Назад | Перейти на главную страницу

Запустите Mod_Python с Mod_WSGI на Apache для Django - Ошибка сегментации (11)

Хорошо, поэтому мне нужно использовать существующий сервер для запуска моего веб-приложения Django. Сервер работает под управлением 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, запускается мой файл python django.wsgi:

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. скомпилировать python с --enable-shared или 2. перекомпилировать mod_wsgi. Я не хочу компилировать python, потому что он был предустановлен на сервере Mac OS 10.6.

Поэтому я выбрал вариант номер два. я бегу ./configure а затем открываю make-файл, как написано, и ищу строку LDLIBS = -lpython2.3 -lpthread -ldl -lutil но я не могу его найти. Ближайшая линия, которую я могу найти, это LDLIBS = -ldl но ясно, что я не могу удалить -lpython если его там нет. (Я почти уверен, что это документация для более старой версии mod_wsgi.) Я искал в make-файле -lpython но ничего не выходит.

Кто-нибудь знает, как скомпилировать mod_wsgi 3.3 так, чтобы «библиотека Python фактически не была связана с модулем mod_wsgi». ??

Также, означает ли это, что mod_wsgi будет использовать Python 2.6 или более старую версию, которую, очевидно, использует mod_python?

Спасибо большое за вашу помощь!

Обновление по запросу Грэма Дамплтона:

$ 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.