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После выполнения команды система предложит рекомендации по настройке безопасности СУБД:
Команда запросит пароль от root-пользователя базы данных. Нажмите Enter.

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

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

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

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

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

Примените все изменения прав доступа.

После завершения настроек безопасности 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-запросы.
После установки вы увидите сообщение:

Создание и запуск приложения
Теперь поговорим о развертывании приложения на 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Добавьте настройки:
- Отключите режим отладки, чтобы избежать утечки секретной информации:
DEBUG = FalseДобавьте IP-адрес сервера или привязанный к нему домен в ALLOWED_HOSTS, чтобы Django мог обслуживать запросы, приходящие при открытии приложения по IP-адресу / домену в веб-браузере:
ALLOWED_HOSTS = ['server_ip_or_domain']Укажите папку, куда будут сохранятся статические файлы приложения при выполнении команды
collectstatic:
STATIC_ROOT = BASE_DIR / 'static'Настройте подключение к базе данных, используя значения, заданные при создании базы и пользователя:
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. Проверка работоспособности приложения
Запустите проект:
- Перейдите на страницу административной панели сайта по адресу http://server_ip_or_domain/admin и проверьте, что он открывается в веб-браузере (порт 8000 должен быть открыт в файрволе):
(venv) $ python manage.py runserver 0.0.0.0:8000

Запустите проект с помощью HTTP-сервера Gunicorn и снова откройте административную панель в веб-браузере, чтобы убедиться, что Gunicorn может обслуживать запросы и передавать их в приложение:
(venv) $ gunicorn --bind 0.0.0.0:8000 project_name.wsgi:applicationПосле настройки приложения и проверки его работоспособности выйдите из виртуального окружения:
(venv) $ deactivateШаг 7. Создание файлов Service и Socket
- Чтобы 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Создайте 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Активируйте сокет, чтобы он автоматически запускался вместе с системой:
$ systemctl start socket_name.socket
$ systemctl enable socket_name.socketПроверьте, что сокет создан, запущен и может принимать соединения с помощью команды:
$ systemctl status socket_name.socket
Проверьте, что файл сокета был создан и находится в директории run:
$ ls /run | grep socket_name.sockШаг 8. Конфигурация Nginx
- Создайте файл конфигурации 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;
}
}Создайте символическую ссылку для активации сайта:
$ ln -s /etc/nginx/sites-available/site_name /etc/nginx/sites-enabledПроверьте конфигурацию сайта:
$ nginx -tЕсли проверка не выявила ошибок, перезапустите nginx для применения изменений:
$ systemctl restart nginxТеперь снова откройте административную панель в браузере, чтобы убедиться, что всё работает корректно.
Отладка и решение проблем
Ошибки могут возникать по разным причинам: из-за опечаток, проблем с правами доступа и т.д. Перечисим самые распространённые проблемы и способы их решения.
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

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

Это ошибка аутентификации или авторизации при подключении к базе данных. Она возникает, когда база данных по какой-либо причине отказывает в доступе.
Убедитесь, что имя пользователя, пароль и название базы данных указаны корректно в переменной 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, чтобы в полной мере использовать ресурсы сервера.