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'