Skip to content

Базовая настройка системы на базе Ред ОС 8 в связке с Nginx + Gunicorn для Django приложений

В данной заметке описаны действия, которые позволили наладить работу связки сервер на РедОС 8 + Nginx + Gunicorn + Django.

Совет

Скачать свежую версию дистрибутива РедОС можно на официальном сайте компании РЕД СОФТ.

Базовая настройка системы

Внимание

Все команды в терминале выполняются на уровне доступа "Пользователь", который добавлен в группу Администраторов системы (sudoers)

Обновим список пакетов и обновим систему

bash
sudo dnf update && sudo dnf upgrade

Установим несколько базовых пакетов для дальнейшей работы

bash
sudo dnf install curl python3 python3-pip nginx git

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

bash
sudo mkdir /var/www

Изменим владельца созданной папки с ROOT на текущего пользователя

bash
sudo chown -R $USER:$USER /var/www/

Внимание

Обязательно смените пользователя, так как дальше мы будем создавать "демона" (службу) где укажем от имени какого пользователя его запускать. Из соображений безопасности лучше избегать запуск "демона" от имени ROOT.

Настройка проекта

Создадим папку для нашего проекта (например Django) и перейдем в неё

bash
mkdir /var/www/testdjango
cd testdjango

Создадим витруальное окружение Python для возможности контроля версий установленых пакетов

bash
python -m venv venv

Активируем созданное виртуальное окружение

bash
source venv/bin/activate

Обновим менеджер пакетов Pip

bash
python -m pip install -U pip

Установим пакет Django

bash
pip install django

Создаем проект Django

bash
django-admin startproject config

Изменим имя проекта на "firstapp" и перейдем в неё.

bash
mv config firstapp
cd firstapp

Примечание

На самом деле менять имя проекта необязательно, это сделано для удобства дальнейшей разработки

Выполним базовую миграцию (инициализацию базы данных) проекта

bash
python manage.py migrate

Создадим "суперпользователя" для возможности администрирования базы данных и сайта вцелом

bash
python manage.py createsuperuser

Запустим проект с помощью встроенного в Django web-сервера

bash
python manage.py runserver '0.0.0.0:8000'

TIP

Проверить работу проекта можно с помощью утилиты curl:

bash
curl -Is http://127.0.0.1:8000/

либо, если Вы установили систему с использованием средств виртуализации (VWare, VirtualBox и т.д.) не забудте в настройках сети виртуальной машины переключить тип подключения к сети с "NAT" на "Bridge".

Также следует в настройках проекта Django .\firstapp\config\settings.py задать ALLOWED_HOSTS = ['*'] на время разработки.

Завершим работу встроенного web-сервера нажатием комбинации клавиш Ctrl+C и перейдем к дальнейшей настройке

Установка WSGI сервера

Установим WSGI сервер Gunicorn

bash
pip install gunicorn

Запустим сервер

bash
python -m gunicorn --bind '0.0.0.0:8000' --workers 5 config.wsgi:application

Завершим работу WSGI сервера нажатием комбинации клавиш Ctrl+C и выйдем из виртуального окружения командой

bash
deactivate

Настройка "демона"

Перейдем в системную директорию

bash
cd /etc/systemd/system/

Создадим *.socket файл следующего содержания

bash
sudo nano firstapp.socket
ini
[Unit]
Description=Gunicorn socket -> First Django App

[Socket]
ListenStream=/run/firstapp.sock

[Install]
WantedBy=sockets.target

Создадим *.service файл следующего содержания

bash
sudo nano firstapp.service
ini
[Unit]
Description=Gunicorn daemon -> First Django App
Requires=firstapp.socket
After=network.target

[Service]
Type=simple
User=1000
Group=1001
WorkingDirectory=/var/www/testdjango/firstapp/
ExecStart=/var/www/testdjango/venv/bin/python -m gunicorn --bind unix:/run/firstapp.sock --workers 5 config.wsgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

Внимание

Обратите внимание на поля User и Group секции [Service]. Тут указаны не имена пользователя и группы, а указан системный код. Это сделано во избежание конфликта имен, который может возникнуть, если в имени пользователя есть символы ., _ и т.д.

Посмотреть коды соответствующие пользователю и группе можно командой

bash
cat /etc/passwd

Проверим корректность записи созданных ранее файлов

bash
sudo systemd-analyze verify firstapp.service

Перечитываем конфигурацию служб

bash
sudo systemctl daemon-reload

Запускаем "демона" (службу)

bash
sudo systemctl enable --now firstapp.service

Совет

Посмотреть информацию о службе можно командой

bash
service firstapp status

Также подробый журнал доступен по команде

bash
journalctl -u firstapp.service

Перезапустить службу можно командой

bash
sudo service firstapp restart

Запустить/Остановить службу можно командой

bash
sudo service firstapp start
sudo service firstapp stop

Убрать службу из автозагрузки можно командой

bash
sudo systemctl disable firstapp.service

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

bash
curl -Is --unix-socket /run/firstapp.sock localhost

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

Настройка прокси сервера

Проверим установку Nginx

bash
nginx -v

Создадим файл конфигурации для нашего сайта

bash
sudo nano /etc/nginx/conf.d/firstapp.conf

Запишем следующее

nginx
server {
    listen 80;
    server_name www.testsite.ru testsite.ru localhost;
    access_log /var/log/nginx/testsite.access.log;
    error_log /var/log/nginx/testsite.error.log;

    location / {
        proxy_pass http://127.0.0.1:8080/;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

Проверим кооректность запонения файла конфигурации

bash
sudo nginx -t

Добавим правило SElinux для включения возможности проксирования запросов

bash
sudo semanage permissive -a httpd_t

Перезапустим службу Nginx чтобы изменения вступили в силу

bash
sudo systemctl restart nginx.service

Проверить сосотояние службы можно командой

bash
service nginx status

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

Вот и всё, мы настроили простейшую конфигурацию для работы с Django/Flask приложениями в системе РедОС.

Создано с VitePress