Как настроить Django-сайт с помощью Apache и WSGI
Я пополнил ряды несчастных людей, которые пытались создать сайт Django, обслуживаемый Apache (на Amazon-linux EC2).
Я успешно настроил Apache и скомпилировал mod_wsgi под Python3.4, используя virtualenv (по адресу /home/ec2-user/web-dev), следуя инструкциям на https://gist.github.com/tanuka72/79ae58b16be4ac3fafe0 и mod_wsgi docs).
Однако при загрузке тестового приложения Django я получаю внутреннюю ошибку сервера.
Глядя на логи, кажется, что во время обработки каким-то образом вызываются несколько версий Python (см. изменение с /home/ec2-user/web-dev/lib64/python3.4 на /usr/lib64/python3.7). Также кажется, что mod_wsgi не может быть импортирован (в то время как 'import mod_wsgi' прекрасно работает из приглашения python в терминале ec2).
Чтобы отладить это, я хотел увидеть, какая версия python была вызвана. Переопределение wsgi.py для удаления вызова функции Django get_wsgi_application предотвращает ошибку. URL показывает результаты работы функции application ниже:
# In test_site/test_site/wsgi.py:
# ...
python_home = '/home/ec2-user/web-dev'
activator = python_home + '/bin/activate_this.py'
with open(activator) as f:
exec(f.read(), {'__file__': activator})
import os
import sys
from django.core.wsgi import get_wsgi_application
sys.path.append('/var/www/test/test_site')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'test_site.settings')
#application = get_wsgi_application()
def application(environ, start_response):
status = '200 OK'
msg = f"sys.path: {sys.path} | sys.prefix: {sys.prefix} | sys.executable: {sys.executable} | Python version {sys.version}"
output = str.encode(msg)
response_headers = [('Content-type', 'text/plain'),
('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Функция имеет запутанный вывод в браузере:
sys.path: ['/home/ec2-user/web-dev/lib64/python3.4/site-packages', '/home/ec2-user/web-dev/lib/python3.4/site-packages', '/var/www/test/test_site/test_site/wsgi.py', '/usr/lib64/python37.zip', '/usr/lib64/python3.7', '/usr/lib64/python3.7/lib-dynload', '/var/www/test/test_site', '/var/www/test/test_site', '/var/www/test/test_site'] | sys.prefix: /home/ec2-user/web-dev | sys.executable: /home/ec2-user/web-dev/bin/python | Python version 3.7.15 (default, Oct 31 2022, 22:44:31)
[GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]
В PYTHONPATH больше папок, чем я ожидал, а также Python 3.7, похоже, запущен вместо 3.4. Интересно, что это показывает, что mod_wsgi работает.
Для справки, мой файл httpd.conf обновлен и включает:
WSGIScriptAlias / /var/www/test/test_site/test_site/wsgi.py
WSGIPythonPath /var/www/test:/home/ec2-user/web-dev/lib/python3.4/site-packages:/home/ec2-user/web-dev/lib64/python3.4/site-packages
<Directory /var/www/test/test_site/test_site>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
Что я могу сделать, чтобы это приложение Django загрузилось? Это только первый шаг - прежде чем я попробую создать свой собственный сайт и добавить базу данных - это должно было занять всего несколько часов. Прошло несколько дней!