Базовая настройка системы на базе Ред ОС 8 в связке с Nginx + Gunicorn для Django приложений
В данной заметке описаны действия, которые позволили наладить работу связки сервер на РедОС 8 + Nginx + Gunicorn + Django.
Совет
Скачать свежую версию дистрибутива РедОС можно на официальном сайте компании РЕД СОФТ.
Базовая настройка системы
Внимание
Все команды в терминале выполняются на уровне доступа "Пользователь", который добавлен в группу Администраторов системы (sudoers)
Обновим список пакетов и обновим систему
sudo dnf update && sudo dnf upgradeУстановим несколько базовых пакетов для дальнейшей работы
sudo dnf install curl python3 python3-pip nginx gitСоздадим папку для размещения файлов сайта
sudo mkdir /var/wwwИзменим владельца созданной папки с ROOT на текущего пользователя
sudo chown -R $USER:$USER /var/www/Внимание
Обязательно смените пользователя, так как дальше мы будем создавать "демона" (службу) где укажем от имени какого пользователя его запускать. Из соображений безопасности лучше избегать запуск "демона" от имени ROOT.
Настройка проекта
Создадим папку для нашего проекта (например Django) и перейдем в неё
mkdir /var/www/testdjango
cd testdjangoСоздадим витруальное окружение Python для возможности контроля версий установленых пакетов
python -m venv venvАктивируем созданное виртуальное окружение
source venv/bin/activateОбновим менеджер пакетов Pip
python -m pip install -U pipУстановим пакет Django
pip install djangoСоздаем проект Django
django-admin startproject configИзменим имя проекта на "firstapp" и перейдем в неё.
mv config firstapp
cd firstappПримечание
На самом деле менять имя проекта необязательно, это сделано для удобства дальнейшей разработки
Выполним базовую миграцию (инициализацию базы данных) проекта
python manage.py migrateСоздадим "суперпользователя" для возможности администрирования базы данных и сайта вцелом
python manage.py createsuperuserЗапустим проект с помощью встроенного в Django web-сервера
python manage.py runserver '0.0.0.0:8000'TIP
Проверить работу проекта можно с помощью утилиты curl:
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
pip install gunicornЗапустим сервер
python -m gunicorn --bind '0.0.0.0:8000' --workers 5 config.wsgi:applicationЗавершим работу WSGI сервера нажатием комбинации клавиш Ctrl+C и выйдем из виртуального окружения командой
deactivateНастройка "демона"
Перейдем в системную директорию
cd /etc/systemd/system/Создадим *.socket файл следующего содержания
sudo nano firstapp.socket[Unit]
Description=Gunicorn socket -> First Django App
[Socket]
ListenStream=/run/firstapp.sock
[Install]
WantedBy=sockets.targetСоздадим *.service файл следующего содержания
sudo nano firstapp.service[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]. Тут указаны не имена пользователя и группы, а указан системный код. Это сделано во избежание конфликта имен, который может возникнуть, если в имени пользователя есть символы ., _ и т.д.
Посмотреть коды соответствующие пользователю и группе можно командой
cat /etc/passwdПроверим корректность записи созданных ранее файлов
sudo systemd-analyze verify firstapp.serviceПеречитываем конфигурацию служб
sudo systemctl daemon-reloadЗапускаем "демона" (службу)
sudo systemctl enable --now firstapp.serviceСовет
Посмотреть информацию о службе можно командой
service firstapp statusТакже подробый журнал доступен по команде
journalctl -u firstapp.serviceПерезапустить службу можно командой
sudo service firstapp restartЗапустить/Остановить службу можно командой
sudo service firstapp start
sudo service firstapp stopУбрать службу из автозагрузки можно командой
sudo systemctl disable firstapp.serviceПроверить работу службы и возможность подключения к сокету можно командой
curl -Is --unix-socket /run/firstapp.sock localhostНа этом настройка "демона" завершена. У нас есть служба которая работает в фоне, перезапускается в случае ошибок и которая способна сама запускаться после перезагрузки системы.
Настройка прокси сервера
Проверим установку Nginx
nginx -vСоздадим файл конфигурации для нашего сайта
sudo nano /etc/nginx/conf.d/firstapp.confЗапишем следующее
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;
}
}Проверим кооректность запонения файла конфигурации
sudo nginx -tДобавим правило SElinux для включения возможности проксирования запросов
sudo semanage permissive -a httpd_tПерезапустим службу Nginx чтобы изменения вступили в силу
sudo systemctl restart nginx.serviceПроверить сосотояние службы можно командой
service nginx statusПроверить работу прокси сервера можно утилитой curl которую мы рассматривали ранее.
Вот и всё, мы настроили простейшую конфигурацию для работы с Django/Flask приложениями в системе РедОС.