Развертывание Django проекта на сервере NGINX в Linux Ubuntu
Используемые термины: Python, UWSGI, NGINX, Ubuntu.
Наше развертывание мы разделим на два этапа:
- Установка и настройка среды Python и UWSGI.
- Настройка веб-сервера NGINX.
Рассмотрим эти процессы по шагам.
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, структура должна получиться примерно такой:
/var/www/my_app/
|-- app1
|-- __init__.py
|-- __pycache__
|-- admin.py
|-- apps.py
|-- migrations
|-- __init__.py
|-- __pycache__
|-- models.py
|-- static
|-- (некоторые файлы)
|-- templates
|-- (некоторые файлы)
|-- tests.py
|-- urls.py
|-- views.py
|-- my_app
|-- __init__.py
|-- __pycache__
|-- asgi.py
|-- settings.py
|-- urls.py
|-- wsgi.py
|-- manage.py
|-- db.sqlite3
Вносим изменения в конфигурационный файл нашего проекта:
vi /var/www/my_app/settings.py
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 — данные для подключения к базе данных. Подробнее, данная настройка описана ниже.
Запускаем команду для сбора всех статических файлов в нашем проекте (из корня проекта):
cd /var/www/my_app/my_app/
./manage.py collectstatic
Настройка uWSGI:
vi /etc/uwsgi/apps-enabled/my_app.ini
[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:
service uwsgi restart
Настройка Nginx
Создаем файл конфигурации для нашего приложения
vi /etc/nginx/conf.d/my_app.conf
Содержимое файла должно быть примерно следующим:
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/;
}
}
Перезапускаем nginx:
systemctl restart nginx
Подключение к базе данных
Рассмотрим пример настройки подключения к СУБД MariaDB/MySQL. Нам необходимо будет настроить как сам сервер баз данных, так и фреймворк. В инструкции опишем полный процесс, начиная от установки СУБД.
MariaDB
Выполним установку и настройку сервера баз данных. Начнем с установки:
apt-get install mariadb-server
Разрешаем автозапуск СУБД:
systemctl enable mariadb
Зададим пароль для учетной записи mysql-root:
mysqladmin -u root password
Установка и запуск завершены. Перейдем к настройке.
Для Django важно, чтобы кодировка была UTF-8. Откроем конфигурационный файл клиента:
vi /etc/mysql/mariadb.conf.d/50-client.cnf
Отредактируем строку:
[mysql]
...
default-character-set = utf8
Аналогичную настройку выполняем в следующем файле:
vi /etc/mysql/mariadb.conf.d/50-mysql-clients.cnf
[mysql]
...
default-character-set = utf8
Редактируем файл для настройки сервера:
vi /etc/mysql/mariadb.conf.d/50-server.cnf
Задаем значения для опций:
character-set-server = utf8
collation_server = utf8_unicode_ci
Для применения настроек перезапускаем сервис:
systemctl restart mariadb
Подготовка базы данных
Предполагается, что у нас есть база данных, которую мы либо создадим на сервере, либо восстановим из резервной копии.
Не забываем также настроить права доступа на базу.
Установка модуля для Python
Для возможности подключения к базе, мы должны установить клиента mysql на сервер. Для этого выполняем две команды:
apt-get install libmysqlclient-dev
pip3 install mysqlclient
Первая команда установит библиотеки, необходимые для установки mysqlclient через менеджер пакетов Python. Вторая, собственно, и установит клиента.
Настройка подключения
Откроем конфигурационный файл нашего приложения:
vi /var/www/my_app/settings.py
Находим:
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. Пример кода будет таким:
- from django.db import connection
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users")
- print(cursor.fetchall())
В данном примере мы извлечем все содержимое таблицы users и выведем это на экран.