Попытка заставить django приложение работать с mod_wsgi на CentOS 5

Я выполняю CentOS 5 и пытаюсь получить django приложение, работающее с mod_wsgi. Я использую .wsgi настройки, я получил работу над Ubuntu. Я также использую альтернативную установку Python (/opt/python2.6/) начиная с моих django потребностей приложения> 2.5, и ОС использует 2.3

Вот ошибка:

[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Target WSGI script '/data/hosting/cubedev/apache/django.wsgi' cannot be loaded as Python module.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] mod_wsgi (pid=23630): Exception occurred processing WSGI script '/data/hosting/cubedev/apache/django.wsgi'.
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] Traceback (most recent call last):
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/data/hosting/cubedev/apache/django.wsgi", line 8, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    import django.core.handlers.wsgi
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 1, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from threading import Lock
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/threading.py", line 13, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from functools import wraps
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]  File "/opt/python2.6/lib/python2.6/functools.py", line 10, in 
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251]    from _functools import partial, reduce
[Thu Mar 04 10:52:15 2010] [error] [client 10.1.0.251] SystemError: dynamic module not initialized properly

И вот мой .wsgi файл

import os
import sys
os.environ['PYTHON_EGG_CACHE'] = '/tmp/django/' # This line was added for CentOS.
os.environ['DJANGO_SETTINGS_MODULE'] = 'cube.settings'

sys.path.append('/data/hosting/cubedev')

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

вывод ldd/usr/lib/httpd/modules/mod_wsgi.so

linux-gate.so.1 =>  (0x00250000)
libpython2.6.so.1.0 => /opt/python2.6/lib/libpython2.6.so.1.0 (0x00be6000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00110000)
libdl.so.2 => /lib/libdl.so.2 (0x00557000)
libutil.so.1 => /lib/libutil.so.1 (0x00128000)
libm.so.6 => /lib/libm.so.6 (0x0012c000)
libc.so.6 => /lib/libc.so.6 (0x00251000)
/lib/ld-linux.so.2 (0x0039a000)

конфигурация vhost

<VirtualHost *:80>
    ServerAdmin admin@example.com
    ServerAlias cube-dev.example.com
    ServerName  cube-dev.example.com
    ErrorLog logs/cube-dev.example.com.error_log
    CustomLog logs/cube-dev.example.com.access_log common
    Alias /phpMyAdmin /var/www/phpMyAdmin/
   # DocumentRoot /data/hosting/cubedev

    WSGIScriptAlias / /data/hosting/cubedev/apache/django.wsgi

    WSGIProcessGroup cubedev.example.com
    WSGIDaemonProcess cubedev.example.com

    Alias /media/ /data/hosting/cubedev/media/
    Alias /adminmedia/  /opt/python2.6/lib/python2.6/site-packages/django/contrib/admin/media/
    Alias /media /data/hosting/cubedev/media

   <Directory "/data/hosting/cubedev/media">
     Order deny,allow
     Allow from all
    </Directory>
</VirtualHost>
7
задан David 15 March 2010 в 18:27
поделиться

1 ответ

SystemError: динамический модуль не инициализирован должным образом - это исключение, которое выдается, когда загружаемая dll (или .so) не может быть правильно инициализирована. В функции _PyImport_LoadDynamicModule из Python / importdl.c на случай, если кому-то интересно.

Итак, рассматриваемая dll / so (динамический модуль на языке Python) - это _functools.so , который является частью стандартной библиотеки Python. Я вижу, что он загружается из /opt/python2.6, поэтому мы знаем, что это не системный питон. Я предполагаю, что это не тот питон, против которого был скомпилирован mod_wsgi. Чтобы проверить, так ли это, запустите ldd mod_wsgi.so и посмотрите, что возвращается libpython .

Поэтому я предлагаю либо перекомпилировать mod_wsgi повторно, передав интерпретатор в /opt/python2.6, запустив его в исходном каталоге wsgi_mod

./configure --with-python=/opt/python2.6/bin/python2.6

, либо убедиться, что sys.prefix указывает на установку python, которая mod_wsgi ожидает, задав его значение в каталоге WSGIPythonHome .

ОБНОВЛЕНИЕ после вывода ldd

Вторая строка вывода ldd показывает, что mod_wsgi загружает pythonlib в / usr / lib вместо /opt/python2.6 . Чтобы дать команду mod_wsgi загрузить это в /opt/python2.6 , вам, вероятно, следует добавить его к переменной окружения LD_LIBRARY_PATH .

Попробуйте сначала в командной строке:

LD_LIBRARY_PATH=/opt/python2.6/lib:$LD_LIBRARY_PATH ldd mod_wsgi.so

, а затем убедитесь, что правильный LD_LIBRARY_PATH указан в сценарии, запускающем Apache.

Еще одно обновление

Вам нужно будет отладить конфигурацию mod_wsgi. Просто попробуйте использовать следующий файл .wsgi вместо вашего и сообщите нам, что вы получите:

def application(environ, start_response):
    status = '200 OK'
    start_response(status, [('Content-type', 'text/plain')])

    try:
        import sys
        return ['\n'.join([sys.prefix, sys.executable])]
    except:
        import traceback as tb
        return [tb.format_exc()]

Если вы получите не «/opt/python2.6», попробуйте вариант

WSGIPythonHome /opt/python2.6

См. Также http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives

7
ответ дан 7 December 2019 в 07:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: