Подключение через защищенный веб-сокет WSS из проекта Django к Redis/Daphne

Я пытаюсь подключить защищенный веб-сокет WSS к Redis/Daphne из моего Django-проекта:

new WebSocket('wss://myproject.com:9002/ws/myChat/')

Но подключиться не удается. В Browser-Console я всегда получаю следующую ошибку:

myCode.js:36 WebSocket connection to 'wss://myproject.com:9002/ws/myChat/' failed

Это единственная ошибка, которую я вижу, например, Nginx (sudo tail -F /var/log/nginx/error.log) не показывает никакой связанной ошибки.

Службы Daphne и Redis, похоже, работают:

Redis Status:

redis-server.service - Advanced key-value store
     Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-04-07 08:44:07 CEST; 55min ago
       Docs: http://redis.io/documentation,
             man:redis-server(1)
    Process: 281 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=0/SUCCESS)
   Main PID: 381 (redis-server)
      Tasks: 4 (limit: 60)
     Memory: 4.1M
     CGroup: /system.slice/redis-server.service
             └─381 /usr/bin/redis-server 127.0.0.1:6379

Daphne-Service Config:

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

[Service]
Type=simple
User=root
WorkingDirectory=/home/django_user/appdir/myProject
ExecStart=/home/django_user/appdir/env/bin/python3 /home/django_user/appdir/env/bin/daphne -e ssl:9002:privateKey=/etc/letsencrypt/live/myproject.com/privkey.pem:certKey=/etc/letsencrypt/myproject.com/fullchain.pem myproject.asgi:application
Restart=on-failure

[Install]
WantedBy=multi-user.target

Дафна-Сервисный статус:

daphne_myproject.service - WebSocket Daphne Service
 Loaded: loaded (/etc/systemd/system/daphne_myproject.service; enabled; vendor preset: enabled)
 Active: active (running) since Thu 2022-04-07 08:44:04 CEST; 50min ago
 Main PID: 277 (python3)
      Tasks: 1 (limit: 60)
     Memory: 74.8M
     CGroup: /system.slice/daphne_myproject.service
             └─277 /home/django_user/appdir/env/bin/python3 /home/django_user/appdir/env/bin/daphne -e ssl:9002:privateKey=/etc/letsencrypt/live/myproject.com/privkey.pem:certKey=/etc/letsencrypt/live/myproject.com/fullchain.pem myproject.asgi:application

Nginx-Config:

upstream websocket{
        server 127.0.0.1:6379;
}
server {
    server_name myproject.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/django_user/appdir/myProject;
    }

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

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/myproject.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/myproject.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    location /ws {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;
        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;
        proxy_set_header X-Forwarded-Proto  $scheme;
    }

}
server {
    if ($host = myproject.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name myproject.com;
    return 404; # managed by Certbot


}

А в моем Django-проекте:

settings.py

ASGI_APPLICATION = "myproject.routing.application"

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}

routing.py: (в чат-приложении, которое является частью моего Django-проекта, открыт wss://myproject... websocket)

from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
import chat.routing


application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            chat.routing.websocket_urlpatterns
        )
    ),
})

asgi.py:

import os

from django.core.asgi import get_asgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

application = get_asgi_application()

Я что-то упустил? Я пытаюсь уже несколько дней, но не могу понять, где может быть проблема. Может ли это быть потому, что я использую корневого пользователя для службы Daphne, а не django_user? Я сделал это, потому что django_user не мог получить доступ к моим сертификатам в /etc/letsencrypt/... (хотя у него есть права sudo).

Я только что решил свою проблему, изменив asgi.py следующим образом. Возможно, это поможет кому-то еще с такой же проблемой:

import os
import django
from channels.routing import get_default_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')

django.setup()

application = get_default_application()
Вернуться на верх