Как настроить каналы Daphne в сервере Nginx

У меня есть приложение Django, которое обслуживает http и websocket запросы. Приложение нормально работает в локальном режиме. Я настроил службы gunicorn и daphne на сервере Nginx, но служба Daphne автоматически останавливается через несколько секунд после запуска, даже если запрос не выполняется. В результате соединение по websocket не устанавливается. Я сталкиваюсь с этой ошибкой уже несколько месяцев и пробовал различные доступные решения, но ничего не помогает.

/etc/nginx/sites-available/myapp

upstream websocket{
     server 0.0.0.0:8001;
}

server {
    listen 80;
    server_name mydomain.com;

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

    location /static/ {
        root /home/ubuntu/projects/my_app;
    }

    # WSGI
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }

    # ASGI
    location /ws/ {
        proxy_pass http://websocket;

        proxy_http_version 1.1;
        proxy_set_header Origin "ws://mydomain.com:8001";
        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;
    }
}

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/projects/my_app
ExecStart=/home/ubuntu/projects/my_app/env/bin/gunicorn \
          --access-logfile - \
          -k uvicorn.workers.UvicornWorker \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          my_app.asgi:application

[Install]
WantedBy=multi-user.target

/etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

/etc/systemd/system/daphne.service

[Unit]
Description=WebSocket Daphne Service
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/projects/my_app
ExecStart=/home/ubuntu/projects/my_app/env/bin/python /home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

sudo systemctl status daphne.service

● daphne.service - WebSocket Daphne Service
     Loaded: loaded (/etc/systemd/system/daphne.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2024-05-02 17:50:38 IST; 11s ago
    Process: 803584 ExecStart=/home/ubuntu/projects/my_app/env/bin/python /home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application (cod>
   Main PID: 803584 (code=exited, status=0/SUCCESS)

May 02 17:50:36 gold-01-0518 systemd[1]: Started WebSocket Daphne Service.
May 02 17:50:38 gold-01-0518 systemd[1]: daphne.service: Succeeded.

sudo tail -F /var/log/nginx/access.log

[02/May/2024:17:52:12 +0530] "GET / HTTP/1.0" 200 4071 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
[02/May/2024:17:52:12 +0530] "GET /ws/video/start/ HTTP/1.0" 404 2400 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"

my_app/asgi.py

import os

from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from channels.security.websocket import AllowedHostsOriginValidator
from features.home.routing import websocket_urlpatterns
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings.__init__')
application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AllowedHostsOriginValidator(
        AuthMiddlewareStack(URLRouter(websocket_urlpatterns)),
    ),
})

routing.py

from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
    re_path(r"ws/video/start/$", consumers.VideoStartConsumer.as_asgi()),
]

Я пытаюсь настроить каналы Daphne для обработки запросов websocket, но служба Daphne автоматически останавливается через несколько секунд после запуска.

пожалуйста, проверьте правильность и последнюю версию установленного канала [daphne], а также проверьте, что вы просто добавили daphne в начало списка installed_app в settings.py

Вернуться на верх