Deploy
Вставить ссылку
Вставить изображение
Краткий глоссарий
Сетевые протоколы и методы передачи данных
Протокол связи
Набор правил и соглашений для обмена данными между устройствами в сети.HTTP (HyperText Transfer Protocol)
Протокол передачи данных в формате «запрос-ответ» между клиентом и сервером. Основа веб-коммуникаций, но не поддерживает постоянные соединения.Multiplexing
Техника передачи нескольких независимых потоков данных через одно физическое соединение. Позволяет одновременную обработку множества запросов.HTTP/2
Современная версия HTTP-протокола с бинарным форматом передачи. Поддерживает мультиплекси́рование (передачу нескольких запросов/потоков данных через одно соединение), приоритизацию и сжатие заголовков.Полнодуплексная связь (Full Duplex)
Режим связи с одновременной двусторонней передачей данных. Обе стороны могут отправлять и получать информацию в один момент времени без переключения режимов.WebSocket
Протокол связи поверх TCP (протокола управления передачей), устанавливающий постоянное полнодуплексное соединение между клиентом и сервером. Позволяет осуществлять одновременную передачу данных в обоих направлениях.SSL/TLS (Secure Sockets Layer/Transport Layer Security)
Протоколы криптографической защиты данных при передаче по сети. Обеспечивают конфиденциальность, целостность и аутентификацию соединения.Система
Демон (daemon)
Фоновая программа в Unix-системах, работающая без прямого взаимодействия с пользователем. Выполняет системные задачи и обслуживает запросы.Systemd
Системный менеджер и демон инициализации в современных Linux-дистрибутивах. Управляет запуском системных служб, ресурсами и зависимостями.Сервис (systemd service)
Программа, работающая в фоновом режиме под управлением systemd. Имеет конфигурационный файл (.service), описывающий условия запуска, окружение и правила перезапуска.systemctl
Командная утилита для управления системными сервисами в Linux. Обеспечивает запуск, остановку, мониторинг и настройку автозагрузки служб.Симлинк (symbolic link)
Ссылка на файл или директорию в файловой системе Linux. Позволяет обращаться к одному объекту через несколько различных путей.Виртуальное окружение Python
Изолированная среда для установки пакетов Python. Содержит собственную копию интерпретатора и менеджера пакетов, предотвращает конфликты версий.Сетевые технологии
Проксирование
Процесс перенаправления сетевых запросов через промежуточный сервер. Клиент взаимодействует с прокси, который передает запросы целевому серверу.Обратный прокси (reverse proxy)
Сервер, принимающий запросы от клиентов и перенаправляющий их на внутренние серверы. Скрывает структуру внутренней сети, обеспечивает безопасность и балансировку нагрузки.TLS-терминация
Процесс расшифровки HTTPS-трафика на прокси-сервере с последующей передачей в незашифрованном виде на внутренние серверы. Снижает нагрузку на бэкенд-приложения.Nginx
Высокопроизводительный веб-сервер и обратный прокси. Используется для раздачи статических файлов, балансировки нагрузки и терминации SSL-соединений.Технологии Python
Событийно-ориентированная архитектура
Парадигма программирования, где поток выполнения определяется событиями. Позволяет эффективно обрабатывать множество одновременных соединений без блокировок.Twisted
Событийно-ориентированный сетевой фреймворк на Python. Обеспечивает асинхронную обработку множественных сетевых соединений.ASGI (Asynchronous Server Gateway Interface)
Спецификация интерфейса между Python-веб-приложениями и серверами для асинхронной обработки запросов. Поддерживает HTTP, WebSocket и другие протоколы.ASGI-сервер
Сервер приложений, реализующий ASGI-спецификацию. Может одновременно обрабатывать HTTP-запросы и постоянные соединения (WebSocket).Daphne
Сервер приложений, реализующий ASGI-спецификацию. Способен обслуживать одновременно HTTP и WebSocket, что делает его идеальным для Django Channels.Gunicorn (Green Unicorn)
WSGI-сервер для запуска традиционных синхронных Django-приложений. Часто используется в паре с Daphne для разделения нагрузки.Вспомогательные сервисы
Let's Encrypt
Автоматизированный центр сертификации, предоставляющий бесплатные SSL-сертификаты для защиты веб-сайтов. Использует протокол ACME для автоматического выпуска и обновления сертификатов.Daphne — ASGI-сервер для развертывания Django Channels на рабочем сервере.
Особенности:
— Одновременная обработка: Daphne поддерживает параллельное выполнение HTTP и WebSocket-запросов. — Асинхронная архитектура: Обеспечивает обработку тысяч одновременных соединений в реальном времени. — Протоколы связи: Корректно реализует спецификации WebSocket и HTTP/2. — Интеграция с Nginx: Работает через обратное проксирование для балансировки нагрузки. — Безопасность: Обеспечивает защищенную обработку TLS-соединений. — Надежность: Интегрируется с systemd для автоматического восстановления при сбоях. — Горизонтальное масштабирование: Поддерживает возможность запуска нескольких независимых экземпляров сервера для распределения нагрузки.Установка Daphne в виртуальное окружение (для Ubuntu)
Daphne рекомендуется устанавливать в виртуальное окружение, для избежания конфликтов, управляемости и т.д. Исключение: Глобальная установка возможна в Docker-контейнерах или выделенных серверах для одного приложения. Мы будем рассматривать установку в виртуальное окружение (для Linux)# Создание и активация вашего виртуального окружения (myvenv)
python -m venv myvenv && source myvenv/bin/activate
# Установка Daphne, channels, twisted
pip install daphne channels twisted[tls,http2]
Cоздание systemd сервиса для Daphne в виртуальном окружении
1. Создание файла сервиса
sudo nano /etc/systemd/system/daphne.service
2. Конфигурация сервиса с виртуальным окружением
Добавляем содержимое (указано в общем виде) Надо прописать собственные пути + посмотреть какой питон работает в виртуальном окружении (может быть несколько папок)[[Unit]
# Описание сервиса для отображения в системных логах и утилитах мониторинга:
# gри systemctl status daphne покажет "Daphne ASGI Server"
Description=Daphne ASGI Server
# Сервис запускается только после полной загрузки сетевых интерфейсов:
# гарантия, что сеть готова до запуска веб-сервера
After=network.target
# Явное указание зависимости от сетевой подсистемы:
# если сеть не поднята - сервис не будет запущен
Wants=network.target
[Service]
# Тип сервиса: simple - основной процесс не форкается:
# systemd отслеживает непосредственно процесс Daphne
Type=simple
# Пользователь и группа от имени которых запускается процесс (безопасность)
# Пример: www-data стандартный пользователь для веб-серверов в Ubuntu
User=www-data
Group=www-data
# Рабочая директория - корневая папка Django-проекта (где manage.py, settings.py)
# Пример: WorkingDirectory=/var/www/myproject
WorkingDirectory=/path/to/your/project
# Переменная окружения PATH указывает на bin виртуального окружения
# Пример: Environment=PATH=/var/www/myproject/venv/bin
Environment=PATH=/path/to/your/project/venv/bin
# Команда запуска: Daphne из виртуального окружения на localhost порт 8000
# Пример: ExecStart=/var/www/myproject/venv/bin/daphne -b 127.0.0.1 -p 8000 myapp.asgi:application
ExecStart=/path/to/your/project/venv/bin/daphne \
-b 127.0.0.1 \ # bind только на локальный интерфейс (безопасность)
-p 8000 \ # порт для приема соединений
your_project.asgi:application # ASGI-приложение Django
# Автоматический перезапуск при аварийном завершении процесса
# Пример: если Daphne упадет с ошибкой - автоматически перезапустится
Restart=on-failure
# Задержка 5 секунд перед перезапуском после сбоя
# Пример: избежание бесконечного цикла перезапусков при постоянных ошибках
RestartSec=5s
[Install]
# Сервис запускается при загрузке системы в многопользовательском режиме
# Пример: после systemctl enable daphne сервис будет стартовать при загрузке ОС
WantedBy=multi-user.target
# Пример daphne.service для проекта MYPROJECT (папка проекта) / myapp (приложение) / myuser (user)
[Unit]
Description=WebSocket Daphne Service
After=network.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/home/myuser/MYPROJECT
# 127.0.0.1 -p 8000 только локально
ExecStart=/home/myuser/MYPROJECT/venv/bin/daphne -b 127.0.0.1 -p 8000 myapp.asgi:application
[Install]
WantedBy=multi-user.target
3. После создания файла daphne.service, выполняем в терминале:
systemctl daemon-reload
systemctl start daphne.service
systemctl status daphne.service
systemctl enable daphne.service # добавляем сервис в автозагрузку
Daphne : HTTP/2 Support
Daphne изначально поддерживает HTTP/2. Однако вам нужно будет сделать пару вещей, чтобы заставить его работать. Во-первых, нужно убедиться, что установили дополнения Twisted http2 и tls. Далее, поскольку все современные браузеры поддерживают HTTP/2 при использовании TLS, вам нужно будет запустить Daphne с включенным TLS:Симлинки для сертификатов:
Добавим симлинки для ssl-сертификатов в папку проекта:
cd /var/www/myproject
ln -s /etc/letsencrypt/live/mysite.ru/privkey.pem key.pem
ln -s /etc/letsencrypt/live/mysite.ru/cert.pem crt.pem
Безопасность - сертификаты в /etc/letsencrypt/ защищены правами root
Автообновление - Let's Encrypt автоматически обновляет сертификаты по исходным путям
Упрощение конфигов - короткие относительные пути в настройках Daphne
Доступность - сервис Daphne получает доступ к сертификатам из рабочей директори
Запуск с HTTPS:
daphne -e ssl:443:privateKey=key.pem:certKey=crt.pem django_project.asgi:application
Редактируем файл daphne.service для добавления поддержки HTTP/2:
sudo nano /etc/systemd/system/daphne.service
[Unit]
Description=WebSocket Daphne Service
After=network.target
[Service]
Type=simple
User=myuser
WorkingDirectory=/var/www/myproject
ExecStart=/var/www/myproject/venv/bin/daphne -e ssl:8443:privateKey=key.pem:certKey=crt.pem mysite.asgi:application
[Install]
WantedBy=multi-user.target
После обновления/создания файла daphne.service, выполняем в терминале:
systemctl daemon-reload
systemctl start daphne.service
systemctl status daphne.service
systemctl enable daphne.service # добавляем сервис в автозагрузку
