Django - обслуживание производства с помощью Apache2
Днями я борюсь с этим.
У меня есть веб-приложение django, написанное на Python 3.10, которое отлично работает при запуске с помощью pipenv shell затем python3.10 manage.py runserver. Кроме того, выполнение команды python3.10 app/wsgi.py завершается без какой-либо ошибки.
Теперь я хочу, чтобы он обслуживался Apache2. Вот мой файл conf:
Listen 8000
<VirtualHost *:8000>
ServerAdmin webmaster@localhost
DocumentRoot /opt/app
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
LogLevel Debug
Alias /static /opt/app/static
<Directory /opt/app/static>
Require all granted
</Directory>
<Directory /opt/app/app>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /opt/app/app/wsgi.py
WSGIDaemonProcess app python-home=/opt/app python-path=/opt/app/app:/usr/local/lib/python3.10:/usr/local/lib/python3.10/lib-dynload:/usr/local/lib/python3.10/site-packages
WSGIProcessGroup app
</VirtualHost>
Результат HTTP 500 при переходе на мой сайт.
Журналы ошибок Apache2:
[core:notice] AH00094: Command line: '/usr/sbin/apache2'
[wsgi:info] mod_wsgi (pid=25232): Attach interpreter ''.
[wsgi:info] mod_wsgi (pid=25232): Adding '/opt/app/app' to path.
[wsgi:info] mod_wsgi (pid=25232): Adding '/usr/local/lib/python3.10' to path.
[wsgi:info] mod_wsgi (pid=25232): Adding '/usr/local/lib/python3.10/lib-dynload' to path.
[wsgi:info] mod_wsgi (pid=25232): Adding '/usr/local/lib/python3.10/site-packages' to path.
[wsgi:info] [remote 192.168.3.110:37296] mod_wsgi (pid=25232, process='app', application=''): Loading Python script file '/opt/app/app/wsgi.py'.
[wsgi:error] [remote 192.168.3.110:37296] mod_wsgi (pid=25232): Failed to exec Python script file '/opt/app/app/wsgi.py'.
[wsgi:error] [remote 192.168.3.110:37296] mod_wsgi (pid=25232): Exception occurred processing WSGI script '/opt/app/app/wsgi.py'.
[wsgi:error] Traceback (most recent call last):
[wsgi:error] File "/opt/app/app/wsgi.py", line 13, in <module>
[wsgi:error] from django.core.wsgi import get_wsgi_application
[wsgi:error] File "/usr/local/lib/python3.10/site-packages/django/__init__.py", line 1, in <module>
[wsgi:error] from django.utils.version import get_version
[wsgi:error] File "/usr/local/lib/python3.10/site-packages/django/utils/version.py", line 1, in <module>
[wsgi:error] import datetime
[wsgi:error] File "/usr/local/lib/python3.10/datetime.py", line 1185
[wsgi:error] def __new__(cls, year, week, weekday, /):
[wsgi:error] ^
[wsgi:error] SyntaxError: invalid syntax
Содержание моего файла wsgi.py :
import sys
import os
from django.core.wsgi import get_wsgi_application
sys.path.append('/opt/app')
sys.path.append('/opt/app/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'vpo.settings')
application = get_wsgi_application()
Любая помощь будет приветствоваться.
Синтаксис параметров python с "/"
def __new__(cls, year, week, weekday, /):
является новым с версии Python 3.8: https://docs.python.org/3/whatsnew/3.8.html#positional-only-parameters
Для компиляции mod_wsgi для Apache необходимо использовать ту же версию python, что и в virt.environment. Пожалуйста, опубликуйте сообщение, которое вы получаете в error.log при запуске Apache. Скорее всего, это не Python 3.10.