Nginx Unit + Django + Virtualenv - Конфигурация

Администрирование linux
Ответить
ustim
Администратор
Сообщения: 130
Зарегистрирован: 03 июн 2021, 09:01
Откуда: Краснодар
Контактная информация:

Nginx Unit + Django + Virtualenv - Конфигурация

Сообщение ustim »

Nginx Unit - это своего рода маршрутизатор или правильнее сказать - роутер, который позволяет запускать приложения разных типов, таких как PHP, Python, Perl и.т.п. Он с легкостью заменяет тот же gunicorn, позволяет конфигурировать прям на лету.
Необходимо учесть, что Unit это лишь дополнение к основному серверу Nginx!

В интернете очень мало информации по описанию установки, особенно русскоязычной, поэтому попробую описать весь процесс установки и настройки Nginx Unit на сервер Debian 9 Stratch.

Самые необходимые команды для Unit:
Просмотреть всю конфигурацию

Код: Выделить всё

curl --unix-socket /var/run/control.unit.sock http://localhost/config/
unit-full-config.PNG
Добавить полную конфигурацию
Учтите, что старая аналогичная конфигурация заменится новой!
(для начала переходим в папку с файлом filename.json, затем добавляем)

Код: Выделить всё

curl -X PUT -d @filename.json --unix-socket /var/run/control.unit.sock :/config
или так

Код: Выделить всё

curl -X PUT -d @filename.json --unix-socket /var/run/control.unit.sock http://localhost/config/
Добавить отдельное приложение
Так же можно добавить ОТДЕЛЬНО одно или несколько приложений из отдельного конфигурационного файла в общую конфигурацию, НО УЧТИТЕ!, что слушатель порта в разделе listeners сам не добавится, отдельно добавить у меня тоже не получилось... поэтому рекомендую делать по предыдущему пункту, т.е править и добавлять приложения и слушателя портов из одного общего файла.

Код: Выделить всё

curl -X PUT -d @filename.json --unix-socket /var/run/control.unit.sock http://localhost/config/applications/name_application
...
Удалить отдельное приложение из конфигурации

Код: Выделить всё

curl -X DELETE --unix-socket /var/run/control.unit.sock 'http://localhost/config/applications/name_app'
Подготовка к установке:
Подготовка базы данных (я делал на своем отдельном сервере)

Код: Выделить всё

sudo -u postgres psql
Создаем БД для нашего проекта

Код: Выделить всё

CREATE DATABASE myproject;
Создаем пользователя для нашей БД

Код: Выделить всё

CREATE USER myprojectuser WITH PASSWORD 'password';
Устанавливаем кодировку, часовой пояс и схему транзакции

Код: Выделить всё

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;
Вот и всё, выходим
1. Устанавливаем все необходимые зависимости Python3

Код: Выделить всё

sudo apt install curl python3-pip python3-dev libpq-dev
Сервер баз данных Postgres у меня находится на отдельном виртуальном сервере, поэтому тут я устанавливать его не буду... Если же вам необходимо ставить его на этом же сервере, то команда для установки будет такая:

Код: Выделить всё

sudo apt install curl python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx
2. Установка Virtualenv
Для начала обновляем pip

Код: Выделить всё

sudo -H pip3 install --upgrade pip
Затем устанавливаем наш излюбленый virtualenv

Код: Выделить всё

sudo -H pip3 install virtualenv
Структура каталогов:
Домен сайта - aishka.ru
Каталог для проекта - aishka
Виртуальная среда - aishkaenv
Проект Django назову - aishkaproject
Получится примерно так
/var/www/aishka/
/var/www/aishka/aishkaenv/
/var/www/aishkaproject/
3. Создаем каталог для хранения приложения и переходим в него

Код: Выделить всё

cd /var/www/

Код: Выделить всё

mkdir aishka

Код: Выделить всё

cd aishka
4. В этом каталоге создаем виртуальную среду

Код: Выделить всё

virtualenv aishkaenv
Эта команда создаст каталог aishkaenv в каталоге проекта aishka и установит в нем локальную копию Python и pip. В этом каталоге можно настроить изолированную среду Python для проекта.
5. Включаем виртуальную среду

Код: Выделить всё

source aishkaenv/bin/activate
6. Теперь, находясь в нашей вирт. среде устанавливаем Django и Psycopg2

Код: Выделить всё

pip install django psycopg2-binary
Вне зависимости от версии Python в виртуальной среде нужно использовать команду pip (не pip3).
Создаем и настраиваем проект Django:
1. Создаем наш проект в папке aishka

Код: Выделить всё

django-admin startproject aishkaproject
2. Настраиваем проект

Код: Выделить всё

nano aishkaproject/aishkaproject/settings.py
Находим директиву ALLOWED_HOSTS и вписываем разрешенные IP, примерно так
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']
Можно вообще разрешить доступ к проекту для всех, просто поставив звездочку * в одинарных кавычках!!
ALLOWED_HOSTS = ['*']
3. Затем находим директиву DATABASES и заполняем адрес и доступ к вашему серверу postgres

Код: Выделить всё

DATABASES = {
	'default': {
	'ENGINE': 'django.db.backends.postgresql_psycopg2',
	'NAME': 'aishka',
	'USER': 'user',
	'PASSWORD': 'password',
	'HOST': 'ip_address',
	'PORT': '',
	}
}
4. Затем в самом конце после
STATIC_URL = '/static/'
Добавляем

Код: Выделить всё

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Завершение:
1. Перемещаем исходную схему базы данных в базу данных PostgreSQL:

Код: Выделить всё

aishkaproject/manage.py makemigrations

Код: Выделить всё

aishkaproject/manage.py migrate
Получим примерно такую картину
(aishkaenv) root@ws02:/var/www/aishka# aishkaproject/manage.py makemigrations
No changes detected
(aishkaenv) root@ws02:/var/www/aishka# aishkaproject/manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
(aishkaenv) root@ws02:/var/www/aishka#
2. Создаем администратора проекта:

Код: Выделить всё

aishkaproject/manage.py createsuperuser
Указываем Имя, Электронную почту и Пароль
3. Перемещаем весь статический контент в подготовленный каталог:

Код: Выделить всё

aishkaproject/manage.py collectstatic
Подтверждаем операцию. В результате все статические файлы переместятся в папку static
(aishkaenv) root@ws02:/var/www/aishka# aishkaproject/manage.py collectstatic

119 static files copied to '/var/www/aishka/aishkaproject/static'.
(aishkaenv) root@ws02:/var/www/aishka#
Для выхода из виртуального окружения и перехода в обычный режим достаточно набрать:

Код: Выделить всё

deactivate
ustim
Администратор
Сообщения: 130
Зарегистрирован: 03 июн 2021, 09:01
Откуда: Краснодар
Контактная информация:

Nginx Unit - Файл конфигурации

Сообщение ustim »

Создаем и открываем сам файл конфигурации, данные из которого мы и будем добавлять в общий конфиг Unit.

Код: Выделить всё

nano /var/www/config.json
Вставляем конфиг, в моем случае он будет таким

Код: Выделить всё

{
    "listeners": {
        "127.0.0.1:8300": {
            "application": "aishkaproject"
        }
    },

    "applications": {
        "aishkaproject": {
           "type": "python 3.5",
           "processes": 2,
           "module": "aishkaproject.wsgi",
           "user": "www-data",
           "group": "www-data",
           "working_directory": "/var/www/aishka/",
           "path": "/var/www/aishka/aishkaproject/",
           "home": "/var/www/aishka/aishkaenv/"
        }
    }
}
Затем вносим данные из нашего файла в общую конфигурацию Unit

Код: Выделить всё

curl -X PUT -d @unit.json --unix-socket /var/run/control.unit.sock :/config
В результате получим
root@ws02:/var/www# curl -X PUT -d @unit.json --unix-socket /var/run/control.unit.sock :/config
{
"success": "Reconfiguration done."
}
root@ws02:/var/www#
Проверяем, что находится в общем конфиге

Код: Выделить всё

curl --unix-socket /var/run/control.unit.sock http://localhost/config/
config-unit-all.PNG
ustim
Администратор
Сообщения: 130
Зарегистрирован: 03 июн 2021, 09:01
Откуда: Краснодар
Контактная информация:

Конфигурация NGINX для Nginx Unit

Сообщение ustim »

Установка и настройка сервера NGINX подробно описана тут https://forum.ustim.ru/viewtopic.php?f=9&t=306#p448
Поэтому заострять на этом внимание я не буду, выложу лишь содержимое файла конфигурации
upstream unit_backend {
server 127.0.0.1:8300;
}

server {
listen 80;
server_name aishka.ru;

root /var/www/aishka/aishkaproject/;

location = /favicon.ico {
access_log off;
log_not_found off;
}

location /static {
root /var/www/aishka/aishkaproject/;
}

location / {
proxy_pass http://unit_backend;
proxy_set_header Host $host;
}

location /.well-known {
allow all;
}

access_log /var/log/nginx/aishka_access.log;
error_log /var/log/nginx/aishka_error.log;
}
Ответить