Переключение с WSGI на ASGI (Gunicorn + Uvicorn) в Django Production – Сайт не загружается
Недавно я создал приложение на Django, используя каналы Django для поддержки WebSocket. Мое asgi.py настроено для обработки как HTTP, так и WebSocket-соединений, и все отлично работает при разработке с использованием Daphne и Uvicorn.
Изначально в процессе разработки мое приложение работало на Gunicorn (WSGI), но поскольку мне нужна поддержка WebSocket, я переключился на Uvicorn (ASGI). Чтобы добиться этого, я изменил свой файл gunicorn.service, чтобы использовать UvicornWorker вместо WSGI worker по умолчанию.
Я столкнулся с ошибкой:
Django может обрабатывать только ASGI/HTTP-соединения, но не срок службы.
Чтобы исправить это, я создал пользовательский рабочий класс на основе решения из старых ответов StackOverflow:
from uvicorn.workers import UvicornWorker
class MyUvicornWorker(UvicornWorker):
CONFIG_KWARGS = {"lifespan": "off"}
Затем я обновил свой файл gunicorn.service:
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=django
Group=www-data
WorkingDirectory=/home/django/my_project
ExecStart=/home/django/my_project/venv/bin/gunicorn \
--limit-request-line 8190 \
--access-logfile /var/log/gunicorn/access.log \
--error-logfile /var/log/gunicorn/error.log \
-k project.uvicorn_worker.MyUvicornWorker \
--workers 3 \
--env DJANGO_SETTINGS_MODULE=project.settings.base \
--bind unix:/run/gunicorn.sock \
--log-level=debug \
project.asgi:application
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
После перезапуска gunicorn.service все, кажется, работает нормально, gunicorn.service и nginx.service активны , ping mysite.com работает Нет ошибок в файле /var/log/gunicorn/error.log
вот файл gunicorn.log
1629975] [INFO] Booting worker with pid: 1629975
[1629977] [INFO] Booting worker with pid: 1629977
[1629976] [INFO] Booting worker with pid: 1629976
[1628940] [INFO] Shutting down
[1628939] [INFO] Shutting down
[1628937] [INFO] Shutting down
[1628940] [INFO] Finished server process [1628940]
[1628333] [WARNING] Worker with pid 1628940 was terminated due to signal 15
[1628937] [INFO] Finished server process [1628937]
[1628939] [INFO] Finished server process [1628939]
[1628333] [WARNING] Worker with pid 1628937 was terminated due to signal 15
[1628333] [WARNING] Worker with pid 1628939 was terminated due to signal 15
[1629975] [INFO] Started server process [1629975]
[1629977] [INFO] Started server process [1629977]
Однако, когда я пытаюсь открыть сайт в браузере, я получаю сообщение: "Эта страница не работает"
Почему мое приложение Django не загружается в браузере, несмотря на то, что Gunicorn и Nginx активны? Есть ли какие-либо ошибки в настройках Gunicorn AS GI?