Найти в Дзене
DFIslamov

Старт изолированного Django3 проекта под деплой на uWSGI и nginx

Банальный и простой пример старта в виртуальном окружении Django 3 проекта под деплой на uWSGI и nginx. Будем считать, что у нас чистая система Ubuntu 18.04, с установленным python версии 3, пользователем root и открытым ssh доступом. Обновим пакеты системы и глобольно установим пакет для работы с виртуальным окружением virtualenv: sudo apt-get update sudo apt install python3-pip pip3 install virtualenv После чего, создадим пользователя с домашней папкой. Не надо работать от пользователя root.  Самый легкий путь - использовать команду adduser - она по шагам проведет по созданию пользователя. Назовем его для примера django-user. В итоге появится домашняя папка /home/django-user  Предлагаю переключиться на пользователя командой su django-user При переключении пользователь django-user уже будет в домашней директории /home/django-user Создадим виртуальное окружение с именем django для хранения проекта командой virtualenv django Теперь в директории /home/django-user появилась папка django,

Банальный и простой пример старта в виртуальном окружении Django 3 проекта под деплой на uWSGI и nginx.

Будем считать, что у нас чистая система Ubuntu 18.04, с установленным python версии 3, пользователем root и открытым ssh доступом. Обновим пакеты системы и глобольно установим пакет для работы с виртуальным окружением virtualenv:

sudo apt-get update
sudo apt install python3-pip
pip3 install virtualenv

После чего, создадим пользователя с домашней папкой. Не надо работать от пользователя root.  Самый легкий путь - использовать команду adduser - она по шагам проведет по созданию пользователя. Назовем его для примера django-user. В итоге появится домашняя папка /home/django-user 

Предлагаю переключиться на пользователя командой

su django-user

При переключении пользователь django-user уже будет в домашней директории /home/django-user Создадим виртуальное окружение с именем django для хранения проекта командой

virtualenv django

Теперь в директории /home/django-user появилась папка django, внутри которой активируем виртуальное окружение командой

source ./bin/activate

Внутри виртуального окружения скачаем django и uwsgi командами:

pip3 install django
pip3 install uwsgi

После, создаем проект django с именем project1 командой

django-admin startproject project1

В итоге создания проекта путь до файла настроек django выглядит так: /home/django-user/django/project1/project1/ а до файла manage.py /home/django-user/django/project1

Базовый простейший скелет проекта готов. Осталось наполнить нашу БД и внести правки в файл settings.py проекта. Для этого в папке /home/django-user/django/project1 запустить две команды

python3 manage.py makemigrations
python3 manage.py migrate

После этого в папке /home/django-user/django/project1/project1/ в файле settings.py вносим изменения

STATIC_ROOT = '/home/django-user/static'
MEDIA_ROOT = '/home/django-user/media'

До сбора статических файлов в указанные директории создадим их, пользователя www-data и одноименную группу, и раздадим права. Это нужно для работы nginx. Важно! Деактивируем виртуальное окружение (команда deactivate) и переключаемся на пользователя root. Команды

mkdir -p /home/django-user/static /home/django-user/media
sudo chown www-data.www-data /home/django-user/media

Активируем виртуальное окружение и собираем статику по папкам. Активировать окружение можно пользователем root, порядок тот-же - папка /home/django-user/django команда source ./bin/activate после чего команда сбора статики (из папки /home/django-user/django/project1)

python3 manage.py collectstatic

Настало время глобально (не забываем деактивировать виртуальное окружение!!!) установить пакеты uwsgi и nginx, и заняться их настройкой. Внимание! Настройка базовая, но ее хватит, что бы разместить проект в интернете. Команда для установки

sudo apt-get install nginx uwsgi uwsgi-plugin-python3

Файлы конфигурации для uwsgi находятся в папке /etc/uwsgi/apps-enabled где надо создать файл django.ini (или другое имя) c содержимым:

[uwsgi]
plugins=python3
virtualenv=/home/django-user/django/bin/activate
chdir=/home/django-user/django/project1
module=project1.wsgi:application
home=/home/django-user/django
master=true
socket=/tmp/project1.sock
chmod-socket=666
uid=www-data
gid=www-data
daemonize=/var/log/uwsgi.log
workers=5

Для настройки nginx в папке /etc/nginx/sites-enabled/ отредкатируем файл default, удалив все содержимое и прописав:

server {
   listen ваш.внешний.IP.адрес:80;
   server)name вашДомен.ru www.вашДомен.ru;
   location / {
       uwsgi_pass unix:///tmp/project1.sock;
       include uwsgi_params;
       uwsgi_read_timeout 300s;
       client_max_body_size 32m;
   }
   location /static/ {
      alias /home/django-user/static/;
   }
   location /media/ {
      alias /home-django-user/media/;
  }
}

Итог. Настроили связь nginx - uwsgi - django для работы проекта в интернете на стандратном порту :80. Для разработки все еще можно пользователем django-user активировать виртуальное окружение, запускать служебный web-сервер на произвольном порту, создавать приложения, работать с БД и так далее. После изменений не забываем собирать статику и перезапускать uwsgi с nginx (требуется не всегда, но по началу лучше перестраховываться) командами, приведенными ниже в соответствующей последовательности

python3 manage.py collectstatic
systemctl restart uwsgi
systemctl restart nginx

Больше статей на zapiskiit.ru