Django: как настроить Apache для обслуживания приложений Django с помощью mod_wsgi

Я пытался настроить приложение Django с Apache и mod_wsgi, но столкнулся с проблемой, о причине которой у меня нет никаких идей. Приложение прекрасно работает с командой "python manage.py runserver", но когда я попытался запустить его с Apache, я получил следующие ошибки в файле журнала ошибок Apache.

Current thread 0x00007fb4880ad940 (most recent call first):
<no Python frame>
Python path configuration:
  PYTHONHOME = '/data/anaconda3/envs/partsdb'
  PYTHONPATH = (not set)
  program name = 'python3'
  isolated = 0
  environment = 1
  user site = 1
  import site = 1
  sys._base_executable = '/usr/bin/python3'
  sys.base_prefix = '/data/anaconda3/envs/partsdb'
  sys.base_exec_prefix = '/data/anaconda3/envs/partsdb'
  sys.platlibdir = 'lib64'
  sys.executable = '/usr/bin/python3'
  sys.prefix = '/data/anaconda3/envs/partsdb'
  sys.exec_prefix = '/data/anaconda3/envs/partsdb'
  sys.path = [
    '/data/anaconda3/envs/partsdb/lib64/python38.zip',
    '/data/anaconda3/envs/partsdb/lib64/python3.8',
    '/data/anaconda3/envs/partsdb/lib64/python3.8/lib-dynload',
  ]
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'

У меня есть следующие строки в файле Apache conf.

WSGIPythonHome /data/anaconda3/envs/partsdb
WSGIPythonPath /data/partsdb/partsdb
WSGIScriptAlias / /data/partsdb/partsdb/wsgi.py
<Directory "/data/partsdb/partsdb">
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

Я также заменил следующие две строки в файле Apache conf

WSGIPythonHome /data/anaconda3/envs/partsdb
WSGIPythonPath /data/partsdb/partsdb

со следующими двумя строками, но получил те же ошибки.

WSGIDaemonProcess partsdb python-path=/data/partsdb/partsdb python-home=/data/anaconda3/envs/hla3db_venv
WSGIProcessGroup partsdb

Файл /data/partsdb/partsdb/wsgi.py содержит только следующие строки кода.

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'partsdb.settings')

application = get_wsgi_application()

После небольшой отладки я обнаружил, что ошибки возникали из-за этой строки в wsgi.py.

from django.core.wsgi import get_wsgi_application

OS моей машины - redhat 8, а версия Apache - 2.4.37. Спасибо за любую информацию/подсказки.

Попробуйте следующий код:

WSGIDaemonProcess partsdb python-path=/data/partsdb/partsdb python-home=/data/anaconda3/envs/hla3db_venv
WSGIProcessGroup partsdb
WSGIApplicationGroup %{GLOBAL}

WSGIPythonHome /data/anaconda3/envs/partsdb
WSGIPythonPath /data/partsdb/partsdb

WSGIScriptAlias / /data/partsdb/partsdb/wsgi.py
<Directory "/data/partsdb/partsdb">
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

Alias /static /path/to/directory/defined/as/STATIC_ROOT/
# The first part is defined by STATIC_URL in settings.py
<Directory /path/to/directory/defined/as/STATIC_ROOT>
    Require all granted
</Directory>

<VirtualHost *:80>
    ServerName mysite.app
    ServerAdmin webmaster@localhost
    # You do not need to specify DocumentRoot
    # I have seen advice not to do so
    ErrorLog ${APACHE_LOG_DIR}error.log
    CustomLog ${APACE_LOG_DIR}access.log combined

</VirtualHost>

Обратите внимание, что я использовал это для одного приложения, запущенного в режиме демона, как указано в документации, на сервере Ubuntu. Проверьте разрешения на папки, в моем случае мне пришлось изменить разрешения, чтобы разрешить apache читать и писать в папки, в которых находился сайт.

Вы также можете посмотреть ответ, который дал Грэм Дамплтон несколько лет назад здесь: Apache с virtualenv и mod_wsgi : ImportError : No module named 'django'

Вернуться на верх