Настройка Nginx и Gunicorn для Django проекта

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

Что такое Django

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

Он использует архитектурный паттерн «модель-вид-шаблон» (MVT), который позволяет отделить логику внутреннего интерфейса от аспектов дизайна внешнего. Такое разделение упрощает управление кодированием, поскольку задачи проектирования отделены от задач логики. 

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

Подготавливаем к разработке Django-приложений на PostgreSQL

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

  1. Определите подходящую среду PostgreSQL или конфигурацию сервера. В зависимости от размера и масштаба проекта может потребоваться выбор облачного серверного решения или самостоятельного хостинга. Для крупных приложений использование выделенных серверов обеспечивает более широкие возможности масштабирования, а также предоставляет доступ к таким функциям, как автоматическое резервное копирование, репликация, политики безопасности и т. д. Здесь можно подобрать Linux VPS https://www.nic.ru/catalog/hosting/linux-vps/
  2. Выберете базу данных. Подумайте, нужна ли вам диаграмма отношений между сущностями (ERD), словарь данных или другие информационные модели. Желательно заранее решить, как данные должны храниться в таблицах различных баз данных в рамках архитектуры вашего приложения. В нашем примере используется PostgreSQL вместо базы данных по умолчанию SQLite.
  3. Зарегистрируйте доменное имя для нового проекта. Здесь можно подобрать домен https://www.nic.ru/catalog/domains/  
  4. Подготовьте новый экземпляр сервера. В нашем случае это Ubuntu 18.04 с базовым брандмауэром и пользователем с привилегиями sudo и без привилегий root.

Настройка Django с Postgres, Nginx и Gunicorn в Ubuntu

Настройка Django с Postgres в Ubuntu предполагает несколько этапов. Мы подготовили пошаговую инструкцию, объясняющую, как установить Django на Ubuntu.

Здесь представлено руководство по установке Ubuntu Server https://www.nic.ru/help/ustanovka-ubuntu-server_11328.html

Установка пакетов из хранилищ Ubuntu

Для корректной работы требуются актуальные релизы пакетов apt. Загрузите обновления, а затем Python 3.

sudo apt update

sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl

В результате будет установлен диспетчер пакетов Python или pip. Он нужен для настройки СУБД Postgres, библиотеки для неё и веб-сервера.

Создадим БД и аккаунт в PostgreSQL

В Postgres используется аутентификация peer authentication. Это значит, что не нужно каждый раз вводить логин и пароль, если имя пользователя ОС идентично имени пользователя Postgres. 

В нашем примере оно звучит как postgres. Чтобы указать его системе Postgres, введите команду через sudo.

sudo -u postgres psql

В диалоговом окне PostgreSQL создайте новую базу данных.

CREATE DATABASE myproject;

Создайте пользователя и задайте для него пароль вместо password.

CREATE USER myprojectuser WITH PASSWORD 'password';

Поставьте кодировку UTF-8.

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';

Задайте схему изоляции транзакций.

ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';

Выберете часовой пояс.

ALTER ROLE myprojectuser SET timezone TO 'UTC';

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

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;

Закройте окно, завершив настройку. 

\q

Развернем виртуальную среду Python

Чтобы пользоваться виртуальной средой, откройте доступ к команде virtualenv через pip. Обновите его и поставьте свежие пакеты. В нашем примере мы рассмотрим команды для Python 3.

sudo -H pip3 install --upgrade pip

sudo -H pip3 install virtualenv

Создайте новый каталог и зайдите в него.

mkdir ~/myprojectdir

cd ~/myprojectdir

Создайте виртуальную среду.

virtualenv myprojectenv

Появится папка, где будут лежать Python и pip. Выполните активацию. 

source myprojectenv/bin/activate

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

pip install django gunicorn psycopg2-binary

Сделаем свой проект Django и настроим его

Каталог в нашем примере уже создан, нужно указать его, чтобы именно в нём хранились файлы нового проекта.

django-admin.py startproject myproject ~/myprojectdir

Откройте конфигурационный файл, чтобы внести в него изменения.

nano ~/myprojectdir/myproject/settings.py

Найдите директиву ALLOWED_HOSTS. Здесь перечислены адреса, с которыми экземпляр Django может соединяться. В квадратных скобках укажите IP или домены, чтобы система их не отклоняла. Выглядит команда так.

ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']

Найдите раздел DATABASES. Здесь нужно изменить значение базы данных на PostgreSQL. Дополнительно задайте условие использовать адаптер psycopr2, укажите название БД и пользователя с паролем.

В самом конце укажите место для хранения статичных файлов. 

STATIC_URL = '/static/'

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

Сохраните изменения и закройте редактор.

Скопируйте начальную схему базы данных.

~/myprojectdir/manage.py makemigrations

~/myprojectdir/manage.py migrate

Создайте ещё один аккаунт для управления проектом.

~/myprojectdir/manage.py createsuperuser

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

~/myprojectdir/manage.py collectstatic

Подтвердите действие. Разрешите подключение в брандмауэре UFW.

sudo ufw allow 8000

Пока еще все незадействованные порты заблокированы. Запустите сервер разработки Django.

~/myprojectdir/manage.py runserver 0.0.0.0:8000

Выполните проверку, написав любой IP из перечисленных ранее в настройках. 

http://server_domain_or_IP:8000

Вы увидите страницу индекса Django. 

Добавьте после URL /admin, чтобы авторизоваться под администратором. 

Создадим файлы сокета и systemd для Gunicorn

Gunicorn нужен для взаимодействия с другими программами и сервисами в вашей системе или сети, интегрируя различные части приложения. Чтобы начать с ним работать, создайте файл с привилегиями sudo.

sudo nano /etc/systemd/system/gunicorn.socket

В этом файле создайте 3 раздела.

  • [Unit] содержит описательную часть сокета.
  • [Socket] определяет его расположение.
  • [Install] задает установку в определённое время

Выглядит это так.

Сохраните изменения и закройте файл. Затем создайте и откройте файл systemd.

sudo nano /etc/systemd/system/gunicorn.service

Здесь представлены аналогичные разделы, которые нужно отредактировать.

В Unit укажите метаданные и зависимости, разрешив инициализацию после связи с хостом.

В разделе Service сформируйте учётную запись пользователя и группу www-data, от которой будет запущен процесс. Владельцем является сам пользователь. Дополнительно задайте карту рабочей папки и напишите команду, которая запустит службы.

В Install впишите информацию, куда будут привязаны службы, активированные при загрузке.

Сокет Gunicorn создан. Сохраните изменения и запустите его.

sudo systemctl start gunicorn.socket

sudo systemctl enable gunicorn.socket

Настроим Nginx в качестве прокси для Gunicorn

Откройте модуль в папке Nginx sites-available.

sudo nano /etc/nginx/sites-available/myproject

Добавьте инструкцию прослушивать порт 80, отвечать на домен или IP-адрес хоста.

server {

    listen 80;

    server_name server_domain_or_IP;

}

Если будут возникать проблемы при поиске favicon, их можно игнорировать. Такую инструкцию тоже пропишите в файле. Здесь же укажите расположение статичных ресурсов, их вы уже перенесли ранее.

Создайте блок location / {}. Он нужен, чтобы задавать соответствия запросам. Внесите в него файл proxy_params, чтобы данные поступали непосредственно в сокет.

Сохранение изменения и закройте файл. Затем запустите его, привязав к папке sites-enabled.

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

Проверьте, нет ли ошибок.

sudo nginx –t

Перезагрузите веб-сервер.

sudo systemctl restart nginx

Теперь трафик идёт через порт 80, поэтому удалите правило доступа к серверу разработки через порт 8000.

sudo ufw delete allow 8000

sudo ufw allow 'Nginx Full'

Готово. Можете подключаться к хосту.

Полезные советы напоследок для установки Django, Gunicorn

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

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

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

Эксперименты безопаснее и удобнее проводить на виртуальном сервере. А высокоуровневый веб-фреймворк Django на языке Python упростит создание проектов и приложений. Это решение подходит для новичков, так как имеет множество стандартных элементов, а также для экспертов, предоставляя уникальные возможности.

Всё ещё остались вопросы?