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

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

Используемые термины: PythonUWSGINGINXUbuntu.

Наше развертывание мы разделим на два этапа:

  1. Установка и настройка среды Python и UWSGI.
  2. Настройка веб-сервера 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. Пример кода будет таким:

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

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

# NGINX # Ubuntu # Интернет # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет