Тариф успешно добавлен в корзину
В корзину
url image

Запуск и настройка Django-проекта на Ubuntu с использованием MariaDB, Gunicorn и Nginx

Django — это высокоуровневый веб-фреймворк с открытым исходным кодом, написанный на языке программирования Python. Он идеально подходит для разработки различных социальных платформ: блогов, форумов, новостных сайтов, корпоративных порталов. 

Для развертывания таких проектов часто применяют стек технологий, включающий СУБД MariaDB, Gunicorn в качестве WSGI-сервера и Nginx для обработки статики и проксирования. Сочетание этих сервисов обеспечивает приложению производительность, безопасность, масштабируемость и отказоустойчивость.

В статье поэтапно разберём базовый процесс конфигурации и запуска приложения, написанного с использованием веб-фреймворка Django. Эту инструкцию можно также применять для всех UNIX-подобных операционных систем (Ubuntu/Debian, CentOS/Rocky/Alma).
 

Требования к серверу

Системные требования для установки зависят от объёма и сложности приложения, которые вы планируете развернуть: 

  • Минимальная конфигурация для тестирования — 1 vCPU, 1 ГБ RAM, 20–30 ГБ SSD. Подойдёт для проверки работоспособности приложения.
  • Оптимальная конфигурация для продакшена — не менее 2–4 vCPU, 4–8 ГБ RAM, 50–100 ГБ SSD. Такая конфигурация позволит поддерживать работу веб-сайта со средней посещаемостью.
  • Конфигурация для стабильной работы под нагрузкой — от 16 vCPU и 100 ГБ RAM, от 100 ГБ SSD. Обеспечит большое количество запросов и возможность масштабировать приложение.

При заказе виртуального сервера вы сможете выбрать Рецепт — набор программного обеспечения, который будет установлен поверх выбранной операционной системы. В том числе и с Django:  как работать с инструментом после автоматической установки из рецепта, рассказываем здесь. 

Подготовка сервера

Убедитесь, что в системе установлены актуальные версии пакетов:

$ apt update

Проверьте версию Python. В Ubuntu, начиная с версии 20.04, предустановлен Python 3. Проверьте свою версию командой:

$ python3 -V

Если Python отсутствует, установите его и сопутствующие модули для запуска приложения. Команда для установки Python 3:

$ apt install -y python3 python3-dev python3-pip python3-venv

Команду нужно выполнить, даже если Python уже установлен в системе: она запустит установку модулей python3-dev и python3-venv при их отсутствии.
Ещё раз обратитесь к интерпретатору Python и убедитесь, что он действительно установлен и доступен для использования:

$ python3 -V

Установка MariaDB

По умолчанию Django работает с файловой базой данных SQLite. Она может использоваться для разработки, но для стабильной работы лучше использовать более производительную базу данных. 

Чтобы решать сложные задачи и полностью раскрыть функционал Django, можно использовать PostgreSQL: в СУБД есть поддержка сложных типов данных, например, JSON, массивы и геоданные. Для типовых задач (развёртывания социальных платформ) подойдёт MariaDB — простота настройки и администрирования делает её оптимальным выбором для большинства веб-сайтов.

Для установки MariaDB введите команду:

$ apt install -y mariadb-server

Настройте безопасность базы данных:

$ mysql_secure_installation

После выполнения команды система предложит рекомендации по настройке безопасности СУБД:

  1. Команда запросит пароль от root-пользователя базы данных. Нажмите Enter.

Ввод пароля от root пользователя
  1. Система предложит использовать аутентификацию через unix_socket. Это безопасный способ аутентификации для локальных подключений: он исключает передачу паролей по сети и использует надёжные механизмы операционной системы для аутентификации.

Установка unix_socket аутентификации
  1. Задайте надёжный пароль для root-пользователя базы данных. Если ранее уже настраивали СУБД и устанавливали пароль, измените его. 

Изменение пароля root-пользователя

  1. По умолчанию MariaDB создаёт анонимного пользователя. Удалите его, чтобы заблокировать неаутентифицированный доступ.
Удаление анонимного пользователя
  1. Запретите подключение к базе данных от лица root-пользователя из сети. Это поможет исключить доступ к СУБД при раскрытии пароля.

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

Удаление базы данных test
  1. Примените все изменения прав доступа.

Применение внесённых изменений

После завершения настроек безопасности MariaDB создайте базу данных, где будет храниться информация приложения и пользователя, который будет с ним взаимодействовать. Для этого необходимо войти в базу данных и выполнить команды:

$ mariadb
MariaDB [(none)]> CREATE USER ‘db_user’@’localhost’ IDENTIFIED BY ‘db_password';
MariaDB [(none)]> CREATE DATABASE ‘db_name’;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON ‘db_name’.* TO ‘db_user’@’localhost’;
MariaDB [(none)]> exit;

Вместо db_user и db_password подставьте имя пользователя и его пароль, а вместо db_name — название базы данных.

Установка Nginx

В качестве обратного прокси-сервера советуем выбрать Nginx. Он поддерживает большее количество одновременных соединений, эффективно обрабатывает запросы на получение статических файлов, например, изображений, CSS или JavaScript-файлов, а также обеспечивает Django дополнительный уровень защиты.

Установите Nginx:

$ apt install -y nginx

Никакой дополнительной конфигурации на данном этапе не требуется. После успешной установки введите в строку поиска доменное имя, привязанное к веб-серверу, или его IP-адрес, чтобы убедиться, что Nginx запущен и может обслуживать HTTP-запросы.

После установки вы увидите сообщение:

 

Стартовая (установленная по умолчанию) страница nginx

Создание и запуск приложения

Теперь поговорим о развертывании приложения на Django с нуля. Если у вас уже есть готовый проект, используйте его: для этого нужно загрузить его файлы на сервер (например, из Git-репозитория или через scp/sftp).

Шаг 1: Создание виртуального окружения и установка зависимостей

Создайте папку для будущего приложения (вместо project_dir, подставьте нужное название папки):

$ mkdir /opt/project_dir
$ cd ~/opt/project_dir

Создайте виртуальное окружение, активируйте его и установите необходимые зависимости:

$ python3 -m venv venv
$ source /venv/bin/activate
(venv) $ pip install django mysql-connector-python gunicorn

В качестве HTTP-сервера лучше использовать Gunicorn: он эффективнее обрабатывает запросы, чем стандартный сервер Django, поэтому больше подходит для работы в продакшене.

Для взаимодействия с базой данных будет использоваться mysql-connector-python.

Если у вас уже есть готовый проект и файл с описанием списка зависимостей, то выполните команду:

(venv) $ pip install -r requirements.txt

Шаг 2. Создание и конфигурация приложения Django

Django содержит утилиту django-admin для решения административных задач. Команда startptoject, входящая в её состав, позволяет создать базовую структуру приложения для запуска и дальнейшей модификации.

С помощью команды создайте базовое приложение и укажите его название (project_name), а также путь к папке, в которой будут находиться его файлы: 

(venv) $ django-admin startproject project_name .

Затем откройте файл с конфигурацией приложения:

(venv) $ nano ./project_name/settings.py

Добавьте настройки:

  1. Отключите режим отладки, чтобы избежать утечки секретной информации:
DEBUG = False
  1. Добавьте IP-адрес сервера или привязанный к нему домен в ALLOWED_HOSTS, чтобы Django мог обслуживать запросы, приходящие при открытии приложения по IP-адресу / домену в веб-браузере:

ALLOWED_HOSTS = ['server_ip_or_domain']
  1. Укажите папку, куда будут сохранятся статические файлы приложения при выполнении команды collectstatic:

STATIC_ROOT = BASE_DIR / 'static'
  1. Настройте подключение к базе данных, используя значения, заданные при создании базы и пользователя:

DATABASES = {
	'default': {
    		'ENGINE': 'mysql.connector.django',
    		'NAME': 'db_name',
    		'USER': 'db_user',
    		'PASSWORD': 'db_password'
	}
}

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

Шаг 3. Выполнение миграций

Выполните миграции, чтобы создать в базе данных таблицы для описанных в проекте моделей:

(venv) $ python manage.py migrate

Шаг 4. Сборка статических файлов приложения

Соберите статические файлы проекта в одной папке:

(venv) $ python manage.py collectstatic

И переместите их в папку, в которой Nginx сможет обслуживать эти файлы:

(venv) $ mkdir -p /var/www/project_static_dir
(venv) $ mv ~./static /var/www/project_static_dir

Собирать статические файлы и перемещать их в папку, доступную Nginx, необходимо каждый раз при изменении CSS или JavaScript-файлов приложения.

Шаг 5. Создание суперпользователя

Создайте учётную запись суперпользователя. Она потребуется для администрирования системы: создания пользователей, назначения прав доступа и управления ролями.

(venv) $ python manage.py createsuperuser

Шаг 6. Проверка работоспособности приложения

Запустите проект:

  1. Перейдите на страницу административной панели сайта по адресу http://server_ip_or_domain/admin и проверьте, что он открывается в веб-браузере (порт 8000 должен быть открыт в файрволе):

(venv) $ python manage.py runserver 0.0.0.0:8000

 

Форма для входа в административную панель
  1. Запустите проект с помощью HTTP-сервера Gunicorn и снова откройте административную панель в веб-браузере, чтобы убедиться, что Gunicorn может обслуживать запросы и передавать их в приложение:

(venv) $ gunicorn --bind 0.0.0.0:8000 project_name.wsgi:application
  1. После настройки приложения и проверки его работоспособности выйдите из виртуального окружения:

(venv) $ deactivate

Шаг 7. Создание файлов Service и Socket

  1. Чтобы Nginx мог эффективно взаимодействовать с HTTP-сервером Gunicorn, создайте unix-сокет, который будет автоматически запускаться вместе с системой:
$ nano /etc/systemd/system/socket_name.socket

Содержимое файла сокета:

[Unit]
Description=socket_description

[Socket]
ListenStream=/run/socket_name.sock

[Install]
WantedBy=sockets.target
  1. Создайте systemd-сервис,чтобы управлять жизненным циклом Django и автоматически запускать его (если оно выключено или приостановлено) каждый раз, когда Nginx получает запрос и отправляет его через сокет в HTTP-сервер Gunicorn:

$ nano /etc/systemd/system/service_name.service

Содержимое файла сервиса:

[Unit]
Description=service_description
Requires=socket_name.socket
After=network.target

[Service]
User=system_user
Group=www-data
WorkingDirectory=/opt/project_dir
ExecStart=/opt/project_dir/venv/bin/gunicorn \
          --bind unix:/run/socket_name.sock \
          project_name.wsgi:application

[Install]
WantedBy=multi-user.target
  1. Активируйте сокет, чтобы он автоматически запускался вместе с системой:

$ systemctl start socket_name.socket
$ systemctl enable socket_name.socket
  1. Проверьте, что сокет создан, запущен и может принимать соединения с помощью команды:

$ systemctl status socket_name.socket
Статус systemd сервиса приложения
  1. Проверьте, что файл сокета был создан и находится в директории run:

$ ls /run | grep socket_name.sock

Шаг 8. Конфигурация Nginx

  1. Создайте файл конфигурации Nginx (вместо site_name укажите название файла с конфигурацией сайта):
$ nano /etc/nginx/sites-available/site_name

Содержимое файла конфигурации:

server {
    listen 80;
    server_name server_ip_or_domain;

    location /static/ {
        root /var/www/project_static_dir;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/socket_name.sock;
    }
}
  1. Создайте символическую ссылку для активации сайта:

$ ln -s /etc/nginx/sites-available/site_name /etc/nginx/sites-enabled
  1. Проверьте конфигурацию сайта:

$ nginx -t
  1. Если проверка не выявила ошибок, перезапустите nginx для применения изменений:

$ systemctl restart nginx

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

 

Отладка и решение проблем

Ошибки могут возникать по разным причинам: из-за опечаток, проблем с правами доступа и т.д. Перечисим самые распространённые проблемы и способы их решения.

502 Bad Gateway 

Ошибка 502 Bad Gateway

Если при открытии страницы приложения в веб-браузере появляется ошибка 502 Bad Gateway, это значит, что Nginx не может проксировать запрос в приложение Django, так как во время его запуска происходит сбой.

Ошибка может возникнуть как в самом Django, так и при запуске сокета или сервиса.

Чтобы определить причину появления проблемы, проверьте логи Nginx:

$ tail /var/log/nginx/error.log

Для  получения более детальной информации проверьте статус сокета и сервиса:

$ systemctl status socket_name.socket
$ systemctl status service_name.service

А также их журналы:

$ journalctl -u socket_name.socket
$ journalctl -u service_name.service

Если вы вносили изменения в исходный код приложения Django, перезапустите соответствующий сервис, чтобы применить изменения:

$ systemctl restart service_name.socket
$ systemctl restart service_name.service

При изменении файлов сервиса или сокета дополнительно выполните команду daemon_reload, чтобы сообщить systemd об изменении конфигурации сокетов и сервисов.
После этого перезагрузите сокет и сервис:

$ systemctl daemon_reload
$ systemctl restart socket_name.socket
$ systemctl restart service_name.service

Ошибка Invalid HTTP_HOST

Ошибка "Invalid HTTP_HOST"

Возникает, если сервер Django получил запрос с доменным именем или IP-адресом, который отсутствует в белом списке ALLOWED_HOSTS в файле settings.py. Как добавить данные, рассказывали в пункте «Создание и конфигурация приложения Django».

Ошибка при подключении к базе данных

Ошибка Access denied for user

Это ошибка аутентификации или авторизации при подключении к базе данных. Она возникает, когда база данных по какой-либо причине отказывает в доступе. 

Убедитесь, что имя пользователя, пароль и название базы данных указаны корректно в переменной DATABASES в файле settings.py. А у пользователя, указанного в настройках Django, есть доступ к выбранной базе данных.

Ошибки прав доступа к файловой системе

Если при просмотре логов Nginx обнаруживается ошибка connect() to unix:/run/socket_name.sock failed (13: Permission denied), значит, Nginx не может подключиться к сокету, так как у него недостаточно прав для доступа к его файлу. 

Для решения проблемы необходимо изменить права доступа к файлу. Обычно для этого достаточно добавить пользователя, который является владельцем файла в группу www-data.

Ошибки в файле сокета, сервиса

Чаще всего проблемы с запуском сокета или сервиса связаны с тем, что в данных файла есть опечатки. Внимательно изучите содержание этих файлов и убедитесь, что там указаны корректные пути, названия и значения свойств, а также отсутствуют синтаксические ошибки. 

Конкретную причину, вызывающую возникновение ошибки, можно определить, изучив логи Nginx и журналы сервиса.

Ошибки конфигурации Nginx

Каждый раз при внесении изменений в конфигурацию Nginx выполняйте команду nginx -t. Она покажет ошибки конфигурации: синтаксические, неверные пути к ресурсам или сокетам, а также другие, препятствующие запуску сервера.

Заключение

Развёртывание Django-приложения с использованием MariaDB, Gunicorn и Nginx позволяет создать надёжную и масштабируемую архитектуру для продакшен-окружения. Конфигурация обеспечивает высокую производительность, безопасность и отказоустойчивость.

После подготовительного этапа можно приступить к настройке контента (media), настроить кэширование, вынести чувствительные данные в переменные виртуального окружения и доработать конфигурацию Nginx и Gunicorn, чтобы в полной мере использовать ресурсы сервера.

Этот материал был полезен?

Скидка новым клиентам
Закажите сервер сегодня и получите скидку на первый месяц аренды!
Наш сайт использует cookies Вы можете отключить их в настройках браузера, но это может ограничить функционал. Оставаясь на сайте, вы соглашаетесь с использованием cookies.