Как отладить основные проблемы настройки django для обслуживания с apache и mod-wsgi?
обычно у людей возникают проблемы с настройкой django для обслуживания apache и mod-wsgi. Общим симптомом является "ошибка импорта"... по какой-то причине (обычно немного отличается в каждом случае) settings.py или подобное не импортируется (см." связанный " в правой колонке на этой странице для многочисленных примеров!).
Я прочитал другие вопросы по этой теме, и ни у одного из них нет решения, которое работает для моей ситуации (один был основным заблуждением плаката идентифицировано ответчиком - у меня, похоже, нет этой проблемы, другие применяются к использованию wsgi из других модулей и т. д.).
когда apache / mod-wsgi не загружается, как вы можете отладить его?
что вы можете сделать, чтобы что-то дать вам лучшее сообщение, чем "ошибка импорта"?
очевидно, я ищу метод, который определит, что не так в моем случае. Но я действительно хотел бы знать, как подойти к отладке такого рода неудача: есть кажется, я не могу найти способ получить информацию о том, что это вызывает его сбой.
в моем случае я пытаюсь сделать то, что кажется прямым развертыванием django с mod-wsgi - действительно по книге, так же, как doc, но получаю ошибку:
ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings
Я не понимаю, почему он не может найти этот модуль.
/home/cmc/src/cm_central/cm_central/settings.py существует, может быть загружен pythonn без ошибок, и на самом деле работает нормально с ./manage.py runserver
.
возможно ли, что в контексте apache возникает некоторая ошибка импорта, которая не возникает, когда я загружаю ее сам? Мне интересно, из-за слов "есть ли ошибка импорта в файле настроек?"... почему он спрашивает об этом? Если бы была ошибка импорта, как бы я ее отладил?
у меня есть это в /etc/apache2/sites-enabled / cm-central:
<VirtualHost *:80>
WSGIScriptAlias / /home/cmc/src/cm_central/cm_central/wsgi.py
WSGIDaemonProcess cm-central.johalla.de python-path=/home/cmc/src/cm_central:/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages
WSGIProcessGroup cm-central.johalla.de
<Directory /home/cmc/src/cm_central/cm_central>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
</VirtualHost>
и это в wsgi.py: (это я не изменил его из того, что django генерируется)
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "cm_central.settings")
from django.core.wsgi import get_wsgi_application
from dj_static import Cling
application = Cling(get_wsgi_application())
полная трассировка:
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Target WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py' cannot be loaded as Python module.
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] mod_wsgi (pid=10273): Exception occurred processing WSGI script '/home/cmc/src/cm_central/cm_central/wsgi.py'.
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] Traceback (most recent call last):
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/src/cm_central/cm_central/wsgi.py", line 16, in <module>
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] application = Cling(get_wsgi_application())
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] django.setup()
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/__init__.py", line 20, in setup
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 46, in __getattr__
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] self._setup(name)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 42, in _setup
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] self._wrapped = Settings(settings_module)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] File "/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages/django/conf/__init__.py", line 98, in __init__
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] % (self.SETTINGS_MODULE, e)
[Sun Nov 09 12:00:01 2014] [error] [client 192.168.122.40] ImportError: Could not import settings 'cm_central.settings' (Is it on sys.path? Is there an import error in the settings file?): No module named cm_central.settings
[Sun Nov 09 12:04:06 2014] [notice] Graceful restart requested, doing restart
[Sun Nov 09 12:04:06 2014] [notice] Apache/2.2.22 (Debian) PHP/5.4.4-14+deb7u14 mod_wsgi/3.3 Python/2.7.3 configured -- resuming normal operations
[Sun Nov 09 21:34:15 2014] [error] Not Found: /
если бы ответ мог помочь мне определить, что не так, это было бы здорово, но еще лучше ответ на "как отладить это". Как узнать почему settings.py не загружается?
6 ответов
вы можете попробовать добавить это в ваш wsgi.py
:
path = os.path.join(os.path.dirname(__file__), "..") # Adapt the path here to match the root of your django project
if path not in sys.path:
sys.path.append(path)
чтобы убедиться, что ваш проект Django находится в пути python ?
если бы ответ мог помочь мне определить, что не так, это было бы здорово - но еще лучше ответ на вопрос"как это отладить". Как узнать почему settings.py не загружается?
трудно ответить на этот вопрос, если мы не знаем точно, что вы уже пробовали. На основе обратной трассировки (Is it on sys.path? Is there an import error in the settings file?
), Я бы скажи:
проверьте, что ваша базовая папка проекта django находится в пути python (который я не читал, что вы сделали, поэтому я сделал предложение выше)
убедитесь, что при загрузке вашего (который вы уже сделали)
во-первых, к реальному вопросу здесь. Как получить больше информации о том, что именно не удается? Возможно, я ошибаюсь, но я почти уверен, что нет инструментов/пакетов/журналов или чего-то еще, что дало бы вам больше информации о проблеме, чем у вас уже есть: трассировка. Поэтому я думаю, что единственный способ отладки этих ошибок - это метод "traceback"; -)
--- теперь к проблеме:
возможно это проблема разрешения. В вашем WSGIDaemonProcess не указаны пользователь или группа, и, возможно, apache не разрешено читать/выполнять файлы. Можете ли вы попробовать добавить пользователя и группу в эту строку следующим образом:
WSGIDaemonProcess cm-central.johalla.de user=<username> group=<username> python-path=/home/cmc/src/cm_central:/home/cmc/virtualenvs/cmc/lib/python2.7/site-packages
кроме того, вы не используете DocumentRoot. Может быть, поэтому он не находит правильный путь? В моих vhosts я всегда включаю DocumentRoot, который имеет тот же путь, что и каталог, но с ведущей косой чертой, в вашем случае:
<VirtualHost *:80>
DocumentRoot /home/cmc/src/cm_central/cm_central/
Так что, возможно, это решит вашу проблему.
сообщение об ошибке довольно явное уже -- mod_wsgi
не удается найти файл настроек (линия 2, os.environ.setdefault
), проверьте свой системный путь (я понимаю, что Django может найти файл настроек при использовании runserver
, а mod_wsgi
не может). Чтобы проверить системный путь, вы можете изменить wsgi.py
файл и печать / журнал sys.path
в самом верху файла:
import sys
print sys.path
в дополнение к виртуальным документам env, указанным @Thomas Waldmann, вам также может потребоваться вручную добавить каталог проекта в sys.путь, как упоминалось здесь, в конфигурационных документах Django. Пример кода, который я использую ниже:
ALLDIRS = ['/usr/local/pythonenv/assessments/lib/python2.6/site-packages']
import os
import sys
import site
# from https://code.google.com/p/modwsgi/wiki/VirtualEnvironments
sys.path.insert(0, '/var/www/assessments/assessments-main/') # settings.py file here
sys.path.insert(1, '/var/www/assessments/')
prev_sys_path = list(sys.path)
for directory in ALLDIRS:
site.addsitedir(directory)
new_sys_path = []
for item in list(sys.path):
if item not in prev_sys_path:
new_sys_path.append(item)
sys.path.remove(item)
sys.path[:0] = new_sys_path
os.environ['DJANGO_SETTINGS_MODULE'] = 'assessments-main.settings'
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
для вашей проблемы могут быть совершенно разные причины.
разрешения-возможно, ваш процесс демона wsgi работает под другим пользователем / группой, чем при интерактивной попытке с python manage.py runserver. возможно, разрешения, установленные для ваших файлов, имеют значение. возможно, попробуйте интерактивно использовать того же пользователя, что и для демона, или наоборот. mod_wsgi имеет хорошие параметры, поэтому вы можете запускать своих демонов под отдельными пользователями, что хорошо для безопасности также из-за разделение.
sys.путь может быть другим (хотя он каким-то образом выглядит правильным в конфигурации демона), cwd может быть другим.
поскольку вы, похоже, используете virtualenv, вы также можете следовать специальным инструкциям по установке для Mod-wsgi и Virtualenvs
наконец-то, an ответ на вопрос высокого уровня: как отлаживать?
и это так очевидно:
распечатайте все, что имеет значение, из settings.py, и посмотрите в журнале apache, чтобы увидеть, что у вас есть, а затем сравните его с тем, что вы получаете в разработке!
связанная статья предлагает этот набор отпечатков в settings.py:
импорт sys, os
print "__name__ =", __name__
print "__file__ =", __file__
print "os.getpid() =", os.getpid()
print "os.getcwd() =", os.getcwd()
print "os.curdir =", os.curdir
print "sys.path =", repr(sys.path)
print "sys.modules.keys() =", repr(sys.modules.keys())
print "sys.modules.has_key('mysite') =", sys.modules.has_key('mysite')
if sys.modules.has_key('mysite'):
print "sys.modules['mysite'].__name__ =", sys.modules['mysite'].__name__
print "sys.modules['mysite'].__file__ =", sys.modules['mysite'].__file__
print "os.environ['DJANGO_SETTINGS_MODULE'] =", os.environ.get('DJANGO_SETTINGS_MODULE', None)
для моих целей я также добавил DATABASE_URL, и позже EMAIL_HOST_USER и т. д.
в статье также есть хорошее объяснение того, как происходит весь процесс запуска, что стоит.
обратите внимание, что он немного устарел с самим django, поэтому окончательная "альтернатива wsgi.py" то, что он придумывает, может быть не так применимо, но техника отладки, безусловно, является.