Не удалось выполнить '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
Есть идеи, где я что-то упускаю?
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.