Как устранить ошибку 502 Bad Gateway при развертывании Django App на Azure с помощью Gunicorn и Nginx
Я пытаюсь развернуть приложение Django на Azure уже около недели. Мой преподаватель выполнил точно такую же установку, которую использовал я, и смог развернуть то же приложение на Azure.
Я следовал нескольким руководствам, в частности, этому от Digital Ocean, и всегда получал один и тот же результат. Когда я указываю IP-адрес, я получаю ошибку 502 Bad Gateway. Единственное изменение, которое я делаю по сравнению с учебником, это открываю порты 8000 и 80. Я делаю это через сетевые настройки Azure.
Я попробовал все рекомендации по устранению неполадок в конце этого руководства. Я перезапустил Gunicorn, Nginx и даже виртуальную машину.
В Azure у меня есть виртуальная машина Standard B1s под управлением Ubuntu 22.04. У меня нет пользовательского домена, только статический IP, назначенный Azure.
Я могу развернуть приложение на сервере разработки просто отлично. Если я привяжу 0.0.0.0:8000 к gunicorn, он также отобразит сайт (за вычетом стилизации)
Gunicorn запускается и работает. Когда я проверяю статус после запуска службы, он показывает активную зеленую точку. Сразу же после попытки доступа к сайту через IP-адрес, если я снова проверю статус Gunicorn, он показывает: gunicorn.socket: Failed with result 'service-start-limit-hit'
Вот что я получаю, выполняя sudo journalctl -fu gunicorn
:
Dec 09 12:12:01 web-ubuntu22-vm1 gunicorn[33891]: raise HaltServer(reason, self.WORKER_BOOT_ERROR)
Dec 09 12:12:01 web-ubuntu22-vm1 gunicorn[33891]: gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>
Dec 09 12:12:01 web-ubuntu22-vm1 systemd[1]: gunicorn.service: Main process exited, code=exited, status=1/FAILURE
Dec 09 12:12:01 web-ubuntu22-vm1 systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Dec 09 12:12:01 web-ubuntu22-vm1 systemd[1]: gunicorn.service: Start request repeated too quickly.
Dec 09 12:12:01 web-ubuntu22-vm1 systemd[1]: gunicorn.service: Failed with result 'exit-code'.
Dec 09 12:12:01 web-ubuntu22-vm1 systemd[1]: Failed to start gunicorn daemon.
Dec 9 12:12:01 web-ubuntu22-vm1 systemd[1]: gunicorn.socket: Failed with result 'service-start-limit-hit'.
Ответ на свой вопрос
Проблема заключалась в том, что мои переменные окружения хранились внутри виртуальной среды проекта. Gunicorn не мог получить доступ к 'SECRET_KEY' оттуда. Я изменил переменные окружения, чтобы они хранились в файле .env
и использовал пакет django-environ для импорта переменных в settings.py
. Теперь все работает как надо.
Мой каталог проекта выглядит следующим образом:
django-project
├── django-app
├── .env
├── .gitignore
├── django-project
├── manage.py
├── README.md
├── requirements.txt
├── static
└── venv
Если у кого-то возникла такая же проблема, он также может экспортировать переменные окружения из .bashrc
. Я думаю, что хранить переменные проекта в директории проекта чище. Обязательно добавьте файл с переменными окружения в .gitignore
.