Ubuntu python django nginx

Запуск Django сайта на nginx + Gunicorn + SSL

Для написания этой статьи ушло очень много сил и времени. Я натыкался на множество инструкций, как на английском, так и на русском языках, но как я понял, — они все были клонами оригинальной статьи на Digital Ocean. Спросите вы, почему я так считаю, а все потому, что все ошибки и неточности передаются с одного ресурса на другой без всяких изменений.

Подготовка

У нас есть обычный VPS c ОС Ubuntu, и мы уже написали в PyCharm или в блокноте свой сайт на Django и его осталось всего лишь опубликовать, привязать домен, установить сертификат и в путь.

Первым делом необходимо обновить список репозиториев и установить сразу же пакет nginx:

apt-get update apt-get install nginx

Я решил хранить файлы сайта в каталоге: /var/www/. В данном случае перемещаемся в каталог cd /var/www/ и создаем новый каталог mkdir geekhero и получаем такой путь: /var/www/geekhero/

Переходим в новый каталог geekhero: cd geekhero и создаем виртуальное окружение: python3 -m venv geekhero_env

Активируем виртуальное окружение: source geekhero_env/bin/activate и устанавливаем в него Django: pip install Django и сразу же ставим pip install gunicorn

Создаем проект: django-admin startproject ghproj

Далее нужно произвести все первичные миграции; для этого прописываем: python manage.py makemigrations , затем python manage.py migrate .

Читайте также:  Tutorial for java swing

После этого создаем административную учетную запись: python manage.py createsuperuser и следуем инструкции.

Далее уже создаем applications, но так как вы читаете данную статью, то вы уже умеете все это делать.

Заходим в Settings.py и прописываем, если отсутствует:
import os – в заголовке, остальное в самом низу текстового файла:

STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Настройка Gunicorn

Идем в каталог /etc/systemd/system/ и создаем два файла: gunicorn.service и gunicorn.socket (вместо имени «gunicorn», можно использовать любое другое):

Содержимое файла gunicorn.service:

[Unit] Description=gunicorn daemon Requires=gunicorn.socket After=network.target [Service] User=root WorkingDirectory=/var/www/geekhero #путь до каталога с файлом manage.py ExecStart=/var/www/geekhero/geekhero_env/bin/gunicorn --workers 5 --bind unix:/run/gunicorn.sock ghproj.wsgi:application #путь до файла gunicorn в виртуальном окружении [Install] WantedBy=multi-user.target

Содержимое файла gunicorn.socket:

[Unit] Description=gunicorn socket [Socket] ListenStream=/run/gunicorn.sock [Install] WantedBy=sockets.target

Для проверки файла gunicorn.service на наличие ошибок:

systemd-analyze verify gunicorn.service

Настройка NGINX

Далее идем в каталог: /etc/nginx/sites-available/ и создаем файл geekhero (название вашего сайта) без расширения:

server < listen 80; server_name example.com; location = /favicon.ico < access_log off; log_not_found off; >location /static/ < root /var/www/geekhero; #путь до static каталога >location /media/ < root /var/www/geekhero; #путь до media каталога >location / < include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; >>

Для того, чтобы создать символическую ссылку на файл в каталоге /etc/nginx/site-enabled/ необходимо ввести следующую команду:

sudo ln -s /etc/nginx/sites-available/geekhero /etc/nginx/sites-enabled/

При любых изменениях оригинального файла, ярлык из sites-enabled нужно удалять и пересоздавать заново командой выше или выполнять команду: sudo systemctl restart nginx

Финальный этап

Для проверки конфигурации nginx нужно ввести команду:

sudo nginx -t Далее запускаем службу gunicorn и создаем socket:

sudo systemctl enable gunicorn sudo systemctl start gunicorn

Для отключения выполняем команды:

sudo systemctl disable gunicorn
sudo systemctl stop gunicorn

Также, при изменении любых данных в HTML-шаблонах, просто перезапускайте сервис gunicorn так:

Помните, что, если вносите изменения в модели, то обязательно нужно сделать python manage.py makemigrations и migrate из каталога с проектом.

Для первичного запуска / полной остановки сервиса Gunicorn:
service gunicorn start / service gunicorn stop

Чтобы посмотреть статус запущенного сервиса нужно ввести:

sudo systemctl status gunicorn или sudo journalctl -u gunicorn.socket (с последней командой правильный вывод такой: мар 05 16:40:19 byfe systemd[1]: Listening on gunicorn socket. )

Для проверки создания сокета, необходимо ввести команду:

Такой вывод считается правильным: /run/gunicorn.sock: socket

Если внес какие-либо изменения в файл gunicorn.service или .socket, необходимо выполнить команду:

Если все нормально сработало, то можем запустить nginx:

Получаем сертификат SSL для домена

Установим certbot от Let’s Encrypt: sudo apt-get install certbot python-certbot-nginx

Произведем первичную настройку certbot: sudo certbot certonly —nginx

И наконец-то автоматически поправим конфигурацию nginx: sudo certbot install —nginx

Осталось только перезапустить сервис nginx: sudo systemctl restart nginx

Подключение дополнительных сайтов

Для установки дополнительных проектов Django, необходимо повторить весь процесс от создания venv и до установки SSL-сертификата для вашего нового домена, только название сервиса и сокета нужно изменять с gunicorn на что-то другое, например:

Сайт1: site1.service и site1.socket
Сайт2: site2.service и site2.socket
Сайт3: site3.service и site3.socket

Итог

В рамках этой статьи мы разобрали как вывести наш сайт в production, установив Django, Gunicorn, nginx и даже certbot от Let’s Encrypt.

Источник

Развертывание Django проекта на сервере NGINX в Linux Ubuntu

Обновлено

Обновлено: 30.05.2021 Опубликовано: 26.05.2021

Рассмотрим эти процессы по шагам.

Python, Django и UWSGI

Устанавливаем необходимые пакеты:

apt-get install nginx uwsgi python3 uwsgi-plugin-python3 python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools

Устанавливаем пакеты для Python:

pip3 install virtualenv uwsgi django

Создаем директорию для хранения стачичных файлов (css, js, img):

mkdir -p /var/www/my_app/static /var/www/my_app/media

chown www-data.www-data /var/www/my_app/media

chown www-data.www-data /var/www/my_app/static

Копируем наше приложение в папку /var/www/my_app, структура должна получиться примерно такой:

Вносим изменения в конфигурационный файл нашего проекта:

from .base import *
.
ALLOWED_HOSTS = [ ‘www.example.com’ ]
.
DATABASES = < 'default': < . >>
.
STATIC_ROOT = ‘/var/www/my_app/static’
MEDIA_ROOT = ‘/var/www/my_app/media’

  • ALLOWED_HOSTS — разрешенные доменные имена, на которых должен открываться наш сайт.
  • DATABASES — данные для подключения к базе данных. Подробнее, данная настройка описана ниже.

Запускаем команду для сбора всех статических файлов в нашем проекте (из корня проекта):

[uwsgi]
chdir = var/www/my_app
env = DJANGO_SETTINGS_MODULE=project.settings.production
wsgi-file = my_app/wsgi.py
workers = 1max-requests=5000
plugins=python3
processes = 5
threads = 2
master = true
die-on-term = true
socket = sedova.sock
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
  • chdir — указываем директорию нашего проекта.
  • env — конфигурационный файл нашего приложения.
  • wsgi-file — относительный путь до файла wsgi.py нашего приложения.

Перезапускаем сервис uwsgi:

Настройка Nginx

Создаем файл конфигурации для нашего приложения

Содержимое файла должно быть примерно следующим:

server listen 80;
server_tokens off;
server_name my_app my_app.domain.local;

location / include uwsgi_params;
uwsgi_pass unix:///run/uwsgi/app/sedova/socket;
>

location /static/ alias /var/www/my_app/static/;
>

location /media/ alias /var/www/my_app/media/;
>
>

Подключение к базе данных

Рассмотрим пример настройки подключения к СУБД MariaDB/MySQL. Нам необходимо будет настроить как сам сервер баз данных, так и фреймворк. В инструкции опишем полный процесс, начиная от установки СУБД.

MariaDB

Выполним установку и настройку сервера баз данных. Начнем с установки:

apt-get install mariadb-server

Разрешаем автозапуск СУБД:

Зададим пароль для учетной записи mysql-root:

mysqladmin -u root password

Установка и запуск завершены. Перейдем к настройке.

Для Django важно, чтобы кодировка была UTF-8. Откроем конфигурационный файл клиента:

[mysql]
.
default-character-set = utf8

Аналогичную настройку выполняем в следующем файле:

[mysql]
.
default-character-set = utf8

Редактируем файл для настройки сервера:

Задаем значения для опций:

character-set-server = utf8
collation_server = utf8_unicode_ci

Для применения настроек перезапускаем сервис:

systemctl restart mariadb

Подготовка базы данных

Предполагается, что у нас есть база данных, которую мы либо создадим на сервере, либо восстановим из резервной копии.

Не забываем также настроить права доступа на базу.

Установка модуля для Python

Для возможности подключения к базе, мы должны установить клиента mysql на сервер. Для этого выполняем две команды:

apt-get install libmysqlclient-dev

Первая команда установит библиотеки, необходимые для установки mysqlclient через менеджер пакетов Python. Вторая, собственно, и установит клиента.

Настройка подключения

Откроем конфигурационный файл нашего приложения:

DATABASES = ‘default’: ‘ENGINE’: ‘django.db.backends.sqlite3’,
‘NAME’: BASE_DIR / ‘db.sqlite3’,
>
>

Данная настройка прописывается, как правило, по умолчанию и позволяет использовать базу sqlite3. Поменяем ее:

DATABASES = ‘default’: ‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘database_name’,
‘HOST’: ‘localhost’,
‘USER’: ‘db_user’,
‘PASSWORD’: ‘db_password’,
>
>

  • NAME — имя базы данных, к которой мы подключимся.
  • HOST — сервер баз данных.
  • USER — пользователь с привилегиями работы с базой данных.
  • PASSWORD — пароль для пользователя.

Делаем выборку

Для проверки настройки создадим select-запрос с нашей базе. Предположим, к таблице users. Пример кода будет таким:

  1. from django.db import connection
  2. cursor = connection.cursor()
  3. cursor.execute(«SELECT * FROM users»)
  4. print(cursor.fetchall())

В данном примере мы извлечем все содержимое таблицы users и выведем это на экран.

Источник

Оцените статью