Для развертывания 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