Как настроить 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 загрузилось? Это только первый шаг - прежде чем я попробую создать свой собственный сайт и добавить базу данных - это должно было занять всего несколько часов. Прошло несколько дней!

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