Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Как установить Django, Nginx и Gunicorn на виртуальный сервер

8062
13 минут чтения
Средний рейтинг статьи: 5

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

В статье разберем, как установить Django на Ubuntu и внести необходимые настройки.

Как Установить Django, Nginx И Gunicorn На Виртуальный Сервер

Что понадобится

Рекомендуем для экспериментов в рамках изучения материала развернуть отдельную виртуальную машину, арендованную у провайдера Timeweb Cloud. Главное, чтобы на ней сразу же была инсталлирована свежая операционная система Ubuntu с базовыми настройками файрвола и созданным пользователем с привилегиями sudo.

Настройки из инструкции не рекомендуется выполнять под пользователем root — мы будем описывать работу именно под пользователем с привилегиями sudo.

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

Инсталлируем пакеты из репозитория Ubuntu

Первоначально скачаем обновления пакетов apt, чтобы пользоваться их актуальными релизами. Следом загрузим Python 3:

    

Команда установит pip, файлы Python, дальше на их основе мы развернем Gunicorn, СУБД PostgreSQL и установим библиотеки, какие понадобятся для работы с Django, а также веб-сервер Nginx.

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

В системе Postgres стандартно применяется аутентификация «peer authentication». Такой подход позволяет обходиться без ввода логина-пароля, если название аккаунта операционки совпадает с пользователем самой базы данных. При желании можно использовать sudo, для этого передадим его системе путем ввода команды:

    

Теперь в диалоговом окне PostgreSQL создадим базу данных под свой проект:

    

Следом пользователя с надежным паролем:

    

Чтобы упростить дальнейшую работу, сразу зададим ряд настроек. Например, изменим кодировку на UTF-8, зададим схему изоляции транзакций «read committed», установим часовой пояс:

    

Теперь для нового пользователя надо открыть доступ на администрирование БД:

    

По завершении настройки закроем диалоговое окно PostgreSQL.

    

Настройка СУБД Postgres завершена, идем дальше.

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

Нам понадобится доступ к использованию команды virtualenv, его мы получим через pip:

    

После инсталляции сделаем новый каталог, где будут размещены проектные модули, и сразу зайдем туда:

    

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

    

Команда сделает подпапку myprojectenv, куда локально будет инсталлирована версия – Python и pip. После инсталляции проведем активацию:

    

После ввода последней команды строка поменяет вид, она показывает: пользователь теперь будет вводить команды в виртуальной среде. Примерный вариант окна:

    

Теперь пришло время для установки Django, Gunicorn и адаптера psycopg2 PostgreSQL:

    

Обязательные для работы компоненты установлены.

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

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

    

Команда явно задает название каталога ~/myprojectdir.

Поменяем настройки проекта

Запустим конфигурационный файл на редактирование:

    

В самый верх файла добавьте:

    

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

    

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

    

Остается в «хвосте» внести параметр, фиксирующий место, где хранить статичные файлы. Это понадобится для Nginx, который мы настроим в паре с PostgreSQL.

    

При закрытии файла обязательно согласитесь с сохранением изменений.

Завершим задачу настройки

Скопируем изначальную схему БД:

    

Создадим аккаунт, администрирующий проект:

    

Придумайте имя, пароль и укажите актуальный email. Если планируется собирать весь статичный контент в одной папке, укажите ее явно:

    

Команда потребует подтверждения, после чего файлы переместятся в папку static. Зададим возможность подключения в брандмауэре UFW:

    

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

Далее запустим сервер разработки Django, выполнив команду:

    

Теперь можно проверить указанный в настройках IP или домен путем ввода в адресную строку браузера:

    

Если откроется страница индекса Django, то все работает. Сразу лучше добавить к адресу путь/admin и пробно зайти в систему под заданным именем-паролем. После аутентификации будет предоставлен доступ к панели администратора. Можно закрывать терминал, где мы производили настройку нажатием комбинации < Ctrl+C>.

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

Сокет Gunicorn появляется при старте systemd, после чего прослушивает подключения. Но сначала создадим файл с привилегиями sudo:

    

В нем мы сделаем новый раздел [Unit], куда внесем описательную часть сокета, раздел [Socket], при помощи которого определим его размещение и [Install] для обеспечения установки в указанное время:

    

При закрытии файла обязательно согласитесь на сохранение изменений. Перейдем к служебному файлу systemd. Его также надо создать и открыть на редактирование:

    

Начнем с раздела [Unit], где укажем метаданные и зависимости – описание службы, предписание инициализировать ее только после подтверждения связи с хостом.

    

Перейдем к разделу [Service]. В нем зададим пользовательскую учетку и группу, под которой планируем запускать процесс. В этом материале укажем в качестве владельца пользователя, потому что он таковым формально и является. Зададим группу www-data, карту рабочей папки и команду, запускающую службы. В качестве примера используем 3 процесса:

    

В «хвосте» внесем раздел [Install]. В нем будем хранить информацию, куда systemd привязывать эти службы, если они будут активированы при загрузке.

    

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

    

Проверим файл сокета Gunicorn

Статус процесса и сам факт того, получилось ли у него стартовать, можно проверить командой:

    

Обязательно убедитесь, что файл gunicorn.sock присутствует в папке /run:

    

Результат проверки будет выведен на экран:

    

Если при старте systemctl status выпала ошибка – в папке /run нет guricorn.sock – это сигнализирует, что сокет Gunicorn фактически не создан. Выяснить причину поможет журнал:

    

Перед повторным запуском рекомендуем проверить содержимое разделов, которые мы вносили выше – не закралась ли там ошибка.

Диагностируем активацию сокета

Важно учитывать, что при запуске gunicorn.socket служба gunicorn.service неактивна. Проверить это можно командой:

    

Результат на экране:

    

Продиагностируем активацию сокета установлением коннекта через curl:

    

Если данные отображаются в HTML-формате, все отлично – Gunicorn стартовал и готов обслуживать программы на Django. Проверим службу командой:

    

Результат на экране:

    

Если при выводе отражаются ошибки, искать первопричину надо начинать с журнала:

    

Также желательно вручную сверить содержимое файла gunicorn.service. Можно перезапустить демона для повторного считывания данных по Gunicorn:

    

До устранения любых ошибок продолжать дальше нельзя.

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

Сначала сделаем и откроем модуль в папке Nginx sites-available:

    

Запустим редактирование файла и внесем инструкцию прослушивать порт 80, отвечать на домен или IP-адрес нашего хоста:

    

Следующим шагом зададим инструкцию игнорировать любые проблемы, связанные с поиском favicon. И укажем, где расположены статичные ресурсы, перенесенные нами ранее в каталог по пути ~/myprojectdir/static.

    

Последним шагом создадим блок location / {}, который задаст соответствие любым запросам. В него внесем файл proxy_params, поставляемый в типовом наборе Nginx. Тогда поступающие данные будут перекидываться прямо в сокет.

    

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

    

Также на этом этапе добавим пользователя www-data в группу текущего пользователя. Для этого выполним:

    

Продиагностируем Nginx на предмет ошибок в синтаксисе:

    

Если все работает без перебоев, перезапустим веб-сервер:

    

По завершении настройки Django с Postgres и Nginx правило доступа к серверу разработки через порт 8000 можно удалять, потому что весь трафик будет направляться на порт 80:

    

Теперь для пробы можно подключиться к нашему хосту по домену или напрямую через IP-адрес. Но перед началом реальной разработки рекомендуем защитить трафик при помощи протокола SSL/TSL. Ведь по умолчанию вся информация передается по сети без шифрования, включая и пароли (в простом текстовом формате).

Простейший вариант – установить сертификат от Let’s Encrypt. Его возможностей достаточно для защиты информации, передаваемой в обе стороны, на хост и с хоста разработчика.

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Выводы

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

8062
13 минут чтения
Средний рейтинг статьи: 5

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server