Невозможно связать приложение 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 updatesudo apt-get upgradeОпционально - Если появляется всплывающее окно/опции, то просто выберите версию сопровождающего pkg.
.python3 -m venv envsudo apt-get install python3-venvsource env/bin/activatepip3 install djangogit clone <your-repo-url>pip3 install gunicornsudo apt-get install -y nginx
.cdв каталог вашего проекта, где хранятсяsettings.py,db.sqlite3и все те файлы вашего проекта.pip3 install -r requirements.txtgunicorn --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 supervisorcd /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-availablesudo touch django.confsudo 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 -tsudo service nginx restart
Теперь вы связали ваш Nginx с вашим gunicorn upstream на app.sock, поэтому перейдите в браузер и введите IP-адрес вашего экземпляра, и вы увидите ваше приложение в реальном времени
Если вы видите ваш сайт без CSS, значит вы все сделали правильно, я отредактирую свой ответ о том, как обслуживать статические файлы вашего приложения Django в Nginx, как только вы подтвердите, что все работает.