Невозможно связать приложение Django с Gunicorn
Для меня было очень сложно развернуть на aws EC2 сервер ubuntu, так как я работаю на windows. Я столкнулся с ошибкой при попытке привязать приложение django к gunicorn. Команда, которую я выполняю, sudo gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
А журнал ошибок показан ниже:
Когда я запускаю gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
, (то есть без sudo
) я получаю другую ошибку:
(venv) ubuntu@ip-172-31-18-196:/var/www/html$ gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
Traceback (most recent call last):
File "/home/ubuntu/.local/bin/gunicorn", line 7, in <module>
from gunicorn.app.wsgiapp import run
ModuleNotFoundError: No module named 'gunicorn'
Но я уже установил gunicorn с помощью команды pip3 install gunicorn --user
. Причина, по которой я добавил --user
в конце, заключается в том, что выполнение pip3 install gunicorn
в активированной виртуальной среде приводит к ошибке разрешения, как показано ниже:
(venv) ubuntu@ip-172-31-18-196:/var/www/html$ pip3 install gunicorn
Collecting gunicorn
Using cached https://files.pythonhosted.org/packages/e4/dd/5b190393e6066286773a67dfcc2f9492058e9b57c4867a95f1ba5caf0a83/gunicorn-20.1.0-py3-none-any.whl
Requirement already satisfied: setuptools>=3.0 in ./venv/lib/python3.6/site-packages (from gunicorn) (40.6.2)
Installing collected packages: gunicorn
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/var/www/html/venv/lib/python3.6/site-packages/gunicorn-20.1.0.dist-info'
Consider using the `--user` option or check the permissions.
You are using pip version 18.1, however version 21.2.4 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Опять же, я уже обновился с python3.5
до python3.6
так, что когда я запускаю python3 на терминале, я получаю следующий вывод
(venv) ubuntu@ip-172-31-18-196:/var/www/html$ python3 --version
Python 3.6.13
Однако я не знаю, почему журнал ошибок ссылается на python3.5 вместо python3.6, как показано здесь: File "/usr/local/lib/python3.5/dist-packages/gunicorn/app/wsgiapp.py"
всякий раз, когда я запускаю sudo gunicorn --bind 0.0.0.0:8000 logistics.wsgi:application
.
Пожалуйста, я хочу знать, почему я получаю эту ошибку
Как загрузить ваше приложение Django в AWS Ubuntu с помощью Gunicorn и NGINX
Вы должны войти в систему как пользователь Ubuntu
и НЕ sudo su/root
Этап 1: Привязка вашего Gunicorn к вашему приложению Django и проверка того, что upstream gunicorn работает нормально. Обратите внимание, что развертывание будет неполным без других этапов
sudo apt-get update
sudo apt-get upgrade
Опционально - Если появляется всплывающее окно/опции, то просто выберите версию сопровождающего pkg.
.python3 -m venv env
sudo apt-get install python3-venv
source env/bin/activate
pip3 install django
git clone <your-repo-url>
pip3 install gunicorn
sudo apt-get install -y nginx
.cd
в каталог вашего проекта, где хранятсяsettings.py
,db.sqlite3
и все те файлы вашего проекта.pip3 install -r requirements.txt
gunicorn --bind 0.0.0.0:8000 <project_name>.wsgi:application
Примечание: имя вашего проекта - это имя основного приложения, которое вы создали в начале с помощью командыdjango-admin startproject <project_name>
Вы увидите
[2021-09-08 15:20:17 +0000] [12789] [INFO] Starting gunicorn 20.1.0 [2021-09-08 15:20:17 +0000] [12789] [INFO] Listening at: http://0.0.0.0:8000 (12789) [2021-09-08 15:20:17 +0000] [12789] [INFO] Using worker: sync [2021-09-08 15:20:17 +0000] [12791] [INFO] Booting worker with pid: 12791
что означает, что вы успешно подключили свой gunicorn для запуска вашего приложения Django, и теперь ваше приложение Django готово к соединению с веб-сервером (в нашем случае NGINX). На этом этап 1 завершен.
Чтобы проверить успех первого этапа, вы можете ввести свой IP с портом :8000
и посмотреть, как работает ваше приложение (убедитесь, что ваша система безопасности aws разрешает порт 8000, иначе вы увидите сообщение 404), но приведенное выше сообщение Booting worker с pid подтверждает, что все работает.
Этап 2: Настройка supervisor
так, чтобы ваш Gunicors автозапускал ваше приложение Django при перезагрузке и после первой загрузки.
sudo apt-get install -y supervisor
cd /etc/supervisor/conf.d/
sudo touch gunicorn.conf
.sudo nano gunicorn.conf
Откроется редактор, в котором нужно ввести скрипт для gunicorn (привязка, которую мы делали на этапе 1, но теперь мы говорим супервизору привязывать gunicorn каждый раз при запуске сервера/инстанса)[program:gunicorn] directory = /home/ubuntu/<path to manage.py> command = /home/ubuntu/env/bin/gunicorn --workers 3 --bind unix:/home/ubuntu/<App Directory>/app.sock <App Name>.wsgi:application autostart = true autorestart = true stderr_logfile = /var/log/gunicorn/gunicorn.err.log stdout_logfile = /var/log/gunicorn/gunicorn.out.log [group:guni] programs:gunicorn
.sudo mkdir /var/log/gunicorn
, здесь мы создаем папку log для наших журналов gunicorn out и error logs.sudo supervisorctl reread
Если вы видите
guni:available
здесь, это означает, что ваш руководитель готов и вы все сделали правильно до этого момента.sudo supervisorctl update
если вы видите
guni: added process group
это еще один маркер того, что вы правильно выполнили шаги.sudo supervisorctl status
Если вы видите Если вы видите
guni:gunicorn RUNNING
, это третий и последний показатель того, что ваш гуникорн теперь правильно настроен. После всех этих шагов подтверждается, что ваш gunicorn теперь двунаправленно обменивается данными с файломapp.sock
, который автоматически создается в каталоге проекта.
Этап 3: Заключительный шаг для соединения вашего сервера Gunicorn upstream с вашим NGINX
cd /etc/nginx/sites-available
sudo touch django.conf
sudo nano django.conf
Откроется редактор nano, в котором вам нужно ввести именно эти настройки сервера.server { listen 80; server_name <ipaddress or domain name> ; #server_name 192.168.0.1 yourdomain.com your_alternate_domain.com; this is how you can add multiple hosts. Do not add any comma just separate it with spaces location / { include proxy_params; proxy_pass http://unix:/home/ubuntu/Appdir/app.sock; } }
sudo nginx -t
(Это проверит синтаксис вашего конфигурационного файла)
.sudo ln django.conf /etc/nginx/sites-enabled/
<---- это очень важный шаг, убедитесь, что здесь нет опечаток, он создает симлинкsudo nginx -t
sudo service nginx restart
Теперь вы связали ваш Nginx с вашим gunicorn upstream на app.sock, поэтому перейдите в браузер и введите IP-адрес вашего экземпляра, и вы увидите ваше приложение в реальном времени
Если вы видите ваш сайт без CSS, значит вы все сделали правильно, я отредактирую свой ответ о том, как обслуживать статические файлы вашего приложения Django в Nginx, как только вы подтвердите, что все работает.