Невозможно связать приложение 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 работает нормально. Обратите внимание, что развертывание будет неполным без других этапов

  1. sudo apt-get update

  2. sudo apt-get upgrade

  3. Опционально - Если появляется всплывающее окно/опции, то просто выберите версию сопровождающего pkg.

    .
  4. python3 -m venv env

  5. sudo apt-get install python3-venv

  6. source env/bin/activate

  7. pip3 install django

  8. git clone <your-repo-url>

  9. pip3 install gunicorn

  10. sudo apt-get install -y nginx

  11. cd в каталог вашего проекта, где хранятся settings.py, db.sqlite3 и все те файлы вашего проекта.

    .
  12. pip3 install -r requirements.txt

  13. gunicorn --bind 0.0.0.0:8000 <project_name>.wsgi:application
    Примечание: имя вашего проекта - это имя основного приложения, которое вы создали в начале с помощью команды django-admin startproject <project_name>

  14. Вы увидите

    [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 при перезагрузке и после первой загрузки.

  1. sudo apt-get install -y supervisor

  2. cd /etc/supervisor/conf.d/

  3. sudo touch gunicorn.conf

  4. 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
    
  5. sudo mkdir /var/log/gunicorn, здесь мы создаем папку log для наших журналов gunicorn out и error logs.

    .
  6. sudo supervisorctl reread

  7. Если вы видите guni:available здесь, это означает, что ваш руководитель готов и вы все сделали правильно до этого момента.

  8. sudo supervisorctl update

  9. если вы видите guni: added process group это еще один маркер того, что вы правильно выполнили шаги.

  10. sudo supervisorctl status

  11. Если вы видите
  12. Если вы видите guni:gunicorn RUNNING, это третий и последний показатель того, что ваш гуникорн теперь правильно настроен. После всех этих шагов подтверждается, что ваш gunicorn теперь двунаправленно обменивается данными с файлом app.sock, который автоматически создается в каталоге проекта.


Этап 3: Заключительный шаг для соединения вашего сервера Gunicorn upstream с вашим NGINX

  1. cd /etc/nginx/sites-available

  2. sudo touch django.conf

  3. 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;
        }
    }
    
  4. sudo nginx -t (Это проверит синтаксис вашего конфигурационного файла)

  5. sudo ln django.conf /etc/nginx/sites-enabled/ <---- это очень важный шаг, убедитесь, что здесь нет опечаток, он создает симлинк

    .
  6. sudo nginx -t

  7. sudo service nginx restart

Теперь вы связали ваш Nginx с вашим gunicorn upstream на app.sock, поэтому перейдите в браузер и введите IP-адрес вашего экземпляра, и вы увидите ваше приложение в реальном времени

Если вы видите ваш сайт без CSS, значит вы все сделали правильно, я отредактирую свой ответ о том, как обслуживать статические файлы вашего приложения Django в Nginx, как только вы подтвердите, что все работает.

Этот ответ любезно предоставлен WOLFx Digital Agency

Вернуться на верх