Как правильно настроить пути и разрешения Python для развертывания Django + mod_wsgi? - PullRequest
3 голосов
/ 05 февраля 2010

Проблема в том, что мой файл wsgi не может правильно импортировать обработчики wsgi.

/var/log/apache2/error.log отчеты:

ImportError: модуль не указан django.core.handlers.wsgi

При поиске в Google это приводит к паре результатов, в основном связанных с ошибками прав доступа, поскольку www-data не может прочитать определенные файлы и / или путь к питону неверен. Некоторые из решений являются расплывчатыми или просто не работают в моих обстоятельствах.

Справочная информация ..

Мой каталог / usr / lib ..

/usr/lib/python2.4
/usr/lib/python2.5
/usr/lib/python2.6
/usr/lib/python-django

Версия Python по умолчанию - 2.5.2. Если я открою переводчика как обычный пользователь, я могу import django.core.handlers.wsgi без проблем.

Если я переключаюсь на www-data, версия Python такая же, и я могу без проблем импортировать модуль django.core.handlers.wsgi.

В моем bashrc я установил свой PYTHONPATH в свой домашний каталог, который содержит все мои сайты django ...

export PYTHONPATH=/home/meder/django-sites/:$PYTHONPATH

Итак, структура каталогов:

django-sites/
   test

test - каталог, созданный django-admin createproject.

Мой виртуальный хост:

<VirtualHost *:80>
    ServerName beta.blah.com
    WSGIScriptAlias / /home/meder/django-sites/test/apache/django.wsgi
    Alias /media /home/meder/django-sites/test/media/
</VirtualHost>

Сам файл /home/meder/django-sites/test/apache/django.wsgi:

import os, sys

sys.path.append('/usr/local/django')
sys.path.append('/home/meder/django-sites')
sys.path.append('/home/meder/django-sites/test')
os.environ['DJANGO_SETTINGS_MODULE'] = 'test.settings'

import django.core.handlers.wsgi

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

Наконец, моя ОС - Debian Lenny, и я взял django 1.1.1 из бэкпортов. Надеюсь, этого достаточно.

Обновление # 1 - для первого ответа вот результат ldd /usr/lib/apache2/modules/mod_wsgi.so:

meder@site:/usr/lib/apache2/modules$ ldd mod_wsgi.so
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7d99000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb7d81000)
    libdl.so.2 => /lib/libdl.so.2 (0xb7d7c000)
    libutil.so.1 => /lib/libutil.so.1 (0xb7d78000)
    libm.so.6 => /lib/libm.so.6 (0xb7d52000)
    libc.so.6 => /lib/libc.so.6 (0xb7c14000)
    /lib/ld-linux.so.2 (0xb7efd000)

Так что он скомпилирован для Python 2.5, а не 2.4.

Ответы [ 3 ]

2 голосов
/ 05 февраля 2010

Поскольку я работаю в Debian, похоже, что django находится в /usr/lib/pymodules/python2.5, а не /usr/lib/python2.5/site-packages.

Я добавил

sys.path.append('/usr/lib/pymodules/python2.5') 

в начало моего файла wsgi, и это было сделано, хотя я чувствую, что должен исправить это более корректно.

1 голос
/ 05 февраля 2010

Не думаю, что ваша проблема связана с sys.path. Я всегда использовал Mod_WSGI с Django, используя процесс Daemonized, например,

# Note these 2 lines
WSGIDaemonProcess site-1 user=user-1 group=user-1 threads=25
WSGIProcessGroup site-1

Alias /media/ /usr/local/django/mysite/media/

<Directory /usr/local/django/mysite/media>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi

<Directory /usr/local/django/mysite/apache>
Order deny,allow
Allow from all

Если вы заметили первые 2 строки - вы можете указать группу и пользователя, который будет ее запускать. В вашем случае вы упоминаете, что www-data может импортировать модуль django, но он не работает, когда Apache развертывает его - возможно, процесс выполняется никем, или каким-либо другим пользователем / группой, которые не иметь привилегии для импорта этого модуля. Добавление строк DaemonProcess и Group должно решить вашу проблему.

НТН.

[1] Для справки - вот документация Django Mod_WSGI - http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

0 голосов
/ 05 февраля 2010

Звучит так, будто вы mod_wsgi не скомпилированы с Python 2.5, а скомпилированы с Python 2.4 или 2.6. Run:

ldd mod_wsgi.so

в файле mod_wsgi.so, где он установлен, чтобы выяснить, что он использует.

Если он отличается, вам нужно будет перекомпилировать mod_wsgi из исходного кода, чтобы он использовал версию, которую вы хотите использовать.

...