Не удалось выполнить 'send' на 'WebSocket': Still in CONNECTING state. while using Django, Nginx, Dophne

daphne.serviceфайл

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

[Service]
Type=simple
User=root
#Group=www-data
WorkingDirectory=/var/www/html/app
EnvironmentFile=/var/www/html/app/.env
ExecStart=/var/www/html/Env/myapp/bin/python3 /var/www/html/Env/myapp/bin/daphne -b 0.0.0.0 -p 8000 config.asgi:application
#Restart=on-failure

[Install]
WantedBy=multi-user.target

Мой конфигурационный файл nginx

upstream channels-backend {
        server localhost:8000;
}
server {
    server_name my.domain.com;
    location = /favicon.ico { access_log off; log_not_found off; }
    location /static {
        alias /var/www/html/app/staticfiles/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/var/www/html/app/gunicorn.sock;
    }

location /ws/ {
    proxy_set_header Host               $http_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;
    proxy_set_header X-Forwarded-Proto  $scheme;
    proxy_set_header X-Url-Scheme       $scheme;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    proxy_pass channels-backend;
}

    client_max_body_size 500M;
}

мой файл asgi.py

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

import os

from channels.auth import AuthMiddlewareStack
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.security.websocket import AllowedHostsOriginValidator, OriginValidator

import base.urls

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")

application = ProtocolTypeRouter({
    'http': get_asgi_application(),
    'websocket': AllowedHostsOriginValidator(
        AuthMiddlewareStack(
            URLRouter(
                base.urls.websocket_url_patterns,
            )
        )
    ),
})

Так как эти вещи легко доступны в интернете, я воспользовался ими. Проблема в том, что во фронт-энде у меня подключено вот так

this.state.notificationSocket = new WebSocket(
            'wss://'
            + window.location.host
            + '/ws/notification/'
        );

        this.state.notificationSocket.onmessage = function(e) {
            const data = JSON.parse(e.data);
            console.log('ON MESSAGE');
            console.log(data);
        }

        this.state.notificationSocket.onclose = function(e) {
            console.log(e);
            console.log('Chat socket closed unexpectedly');
        }

и при наступлении некоторого события, например, при нажатии кнопки

this.state.notificationSocket.send(JSON.stringify({
                'message': message
            }));

Говорит, что еще подключается и автоматически отключается, PFA

enter image description here

Есть идеи, где я что-то упускаю?

NGINX будет передавать запросы в Daphne на основе запрошенного путь. Если вы используете ваш проект Django для SSL/TLS, вы редактируете settings/pro.py файл настроек и добавьте в него следующие настройки:

SECURE_SSL_REDIRECT = True
CSRF_COOKIE_SECURE = True

Daphne - это сервер HTTP, HTTP2 и WebSocket для ASGI, разработанный для обслуживания Каналы. Вы можете запустить Daphne вместе с uWSGI для эффективного обслуживания ASGI и WSGI приложений. NGINX работает перед uWSGI, Gunicorn и Daphne в качестве обратного прокси-сервера. NGINX встречает веб и передает запросы на сервер приложений на основе префикса пути. Более того, NGINX также обслуживает статические файлы и перенаправляет небезопасные запросы на безопасные. Такая установка сокращает время простоя, потребляет меньше ресурсов сервера и обеспечивает более высокую производительность и безопасность.

Установите tls и http2. (Поддержка HTTP/2 не включена )

pip install -U 'Twisted[tls,http2]'

Я думаю, что вы просмотрели файл nginx.conf. Вы используете директиву proxy_pass для передачи запросов к Daphne и включаете некоторые дополнительные директивы прокси. Базовая конфигурация:

 upstream yourproject {
 server unix:/tmp/gunicorn.sock;
    }

upstream daphne {
 server unix:/tmp/daphne.sock;
}
server {
 listen 80;
 server_name www.yourproject.com yourproject.com;
 return 301 https://yourproject.com$request_uri;
}
server {
 listen 443 ssl;
 ssl_certificate /home/projects/ssl/yourproject.crt;
 ssl_certificate_key /home/projects/ssl/yourproject.key;
 
 server_name www.yourproject.com yourproject.com;
 access_log off;
 error_log /home/projects/logs/nginx_error.log;
 location / {
 include /etc/nginx/wsgi_params;
 wsgi_pass yourproject;
 }
 location /ws/ {
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection "upgrade";
 proxy_redirect off;
 proxy_pass http://daphne;

 }
 location /static/ {
 alias /home/projects/static/;
 }
 location /media/ {
 alias /home/projects/media/;
 }
} 

Более подробную информацию о Дафне вы можете найти на сайте https://github.com/django/. daphne.

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