Развертываение Django Channels с использованием Nginx, Daphne, uWSGI

Для развертывания Django Channels  на боевом сервере, использую следующую схему взаимодействия компонентов:

Конфигурация Nginx:

upstream django {
    server unix:///path/to/sockets/uwsgi.sock;
}


upstream asgi {
    server unix:/path/to/sockets/asgi.sock;
}

# конфигурация веб-сервера
server {
    # порт, который будет слушать веб-сервер
    listen      443 ssl;
    ssl_certificate /path/to/certificate/localhost.crt;
    ssl_certificate_key /path/to/certificate/localhost.key;
    # доменное имя
    server_name     127.0.0.1;
    charset     utf-8;
    # максимальный размер загружаемых на сервер данных
    client_max_body_size 75M;

    # обслуживание медиа файлов и статики Django
    location /media  {
        alias /path/to/files/media;  # расположение медиафайлов (при необходимости измените)
    }

    location /static {
        alias /path/to/files/static;  # расположение статики (при необходимости измените)
    }

    location /ws/ {
            proxy_pass http://asgi;
            proxy_http_version 1.1;

            proxy_read_timeout 86400;
            proxy_redirect     off;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
    }

    # Остальные запросы перенаправляются в Django приложение
    location / {
        uwsgi_pass  django;
        include     /path/to/file/uwsgi_params;
        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;
        uwsgi_read_timeout          600;
    }
}



Конфигурация uwsgi_params

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Для запуска uwsgi настраиваем ini файл конфигурации app_uwsgi.ini:

 

[uwsgi]

# Настройки, связанные с Django
# Корневая папка проекта (полный путь)
chdir           = /path/to/app/folder
# Django wsgi файл
module          = app.wsgi
# полный путь к виртуальному окружению
#home            = /path/to/virt/env/

# общие настройки
# master
master          = true
# максимальное количество процессов
processes       = 10
# полный путь к файлу сокета
socket          = /path/to/sockets/uwsgi.sock
# права доступа к файлу сокета
chmod-socket    = 666
# очищать окружение от служебных файлов uwsgi по завершению
vacuum          = true

Для запуска Daphne создаем файл asgi.ini в папке с django приложением app/asgi.py:

"""
ASGI entrypoint. Configures Django and then runs the application
defined in the ASGI_APPLICATION setting.
"""

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "app.settings")
django.setup()
application = get_default_application()

 

Запуск сервисов

Запуск nginx:

sudo services nginx start

Запуск wsgi (для работы Djanogo):

uwsgi --ini /path/to/app_uwsgi.ini --thunder-lock --enable-threads

Запуск Daphne (для асинхронного обмена, ws, wss):

daphne -u /path/to/app_asgi.sock --proxy-headers app.asgi:application