Mod_wsgi: ImportError: Нет модуля с именем 'encodings'

Я использую Apache 2.2.15 на CentOS 6.5. Я пытаюсь настроить приложение Django с помощью mod_wsgi. Я использую виртуальную среду, а mod_wsgi настроен с помощью --with-python=/path/to/virtualenv/bin/python3.4.

Я добавил это в свой httpd.conf:

WSGIPythonPath /srv/myproject:/path/to/virtualenv/lib/python3.4/site-packages
WSGIPythonHome /path/to/virtualenv
<VirtualHost *:80>
WSGIScriptAlias / /srv/myproject/myproject/wsgi.py
...
</VirtualHost>

В wsgi.py я добавил

sys.path.insert(1, "/path/to/virtualenv/lib/python3.4/site-packages")

Проблема в том, что когда я пытаюсь открыть приложение в своем браузере, он загружается неограниченно долго. Здесь журнал ошибок Apache:

Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
[Mon Jun 30 17:37:28 2014] [notice] child pid 19370 exit signal Aborted (6)
[Mon Jun 30 17:37:28 2014] [notice] child pid 19371 exit signal Aborted (6)
...
[Mon Jun 30 17:37:28 2014] [notice] child pid 19377 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'

Интересно, что как при установке Python (2.6), так и в версии виртуальной среды (3.4), import encodings работает отлично! Я попытался использовать пример WSGI script from страницу проверки mod_wsgiYourInstallation, чтобы подтвердить, какая версия Python используется Apache, но я получаю тот же ImportError.

Есть ли у кого-нибудь предложение для следующих шагов? Я просмотрел документы, но я не знаю, куда идти отсюда.

Ответ 1

Итак, с некоторой помощью с моими друзьями (IE: SysAdmins), мы выяснили это вчера вечером. Я лучше всего научился примеру, поэтому предположим, что вы используете Apache с mod_wsgi в качестве группы Linux Apache с пользователем flipperpa. Предположим, что вы размещаете в /home/my _project с помощью wsgi.py в my_project/wsgi.py.

На верхнем уровне (ls -l/):

drwxr-xr-x.  47 root root  4096 Jul  9 09:43 home

В домашнем каталоге (ls -l/home):

drwxrwsr-x   7 flipper        apache 4096 Jul 29 10:22 my_project

Это был ключ. В нижнем регистре "s" означает бит setgid группы apache, и бит выполнения установлен. Окончательный "x", конечно, означает, что любой может выполнить.

Проверьте свои права на дерево; это сделало трюк для нас.

Ответ 2

Проблема была вызвана SELinux. Я сделал это:

  • переместил файлы проекта в /home/admin/myproject
  • измененные разрешения, как в ответе FlipperPA
  • и, насколько я считаю, установите httpd_enable_homedirs SELinux boolean на on с помощью setsebool -P httpd_enable_homedirs on.

руководство SELinux на вики CentOS было очень полезно. Например, для отладки вы можете запустить setenforce Permissive, поэтому SELinux не будет применять свои правила, но все равно записывать в журнал. Просто запомните setenforce Enforcing снова после этого!

Ответ 3

В Windows я решил эту проблему, поставив каталог Lib моей установки Python непосредственно на PYTHONPATH. Это необходимо, хотя, если вы запустите Python непосредственно в той же оболочке, для этого не требуется найти пакет кодировок:

set PYTHONPATH=C:\WinPython-64bit-3.4.4.6Qt5\python-3.4.4.amd64\Lib;%PYTHONPATH%
c:\apache24\bin\httpd.exe

Также обязательно используйте правильную версию mod_wsgi. Я загрузил мой из Страница неофициальных бинарных страниц и выбрал его для соответствия Python (64 бит 3.4 в приведенном выше примере). Мой сайт корректно работает с Python после вышеупомянутого изменения в .bat файле, начиная с Apache.

Обратите внимание, что моя версия Python, WinPython, устанавливается путем разархивирования установки и размещения ее на диске C:. Таким образом, он не установлен в реестре обычным способом Windows, что должно минимизировать проблемы взаимодействия с реестром.