Django Channels - Websocket соединение не удалось (производство)
Я решил добавить websockets в свой проект, чтобы мгновенно общаться с базой данных. Но сначала я решил просто проверить, будут ли работать websockets на продакшене. Я сделал тестовую версию с чатом из документации Django. К моему глубокому сожалению, они работают только локально, и я попытался выяснить, в чем дело. Но у меня ничего не получилось.
Проблема в том, что на localhost websockets работают нормально, но когда я заливаю их в production, возникает ошибка.
В asgi я пытался заменить test.routing на path(...), но это ничего не изменило.
asgi.py
import os
from channels.auth import AuthMiddlewareStack
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application
import test.routing
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ERA.settings")
ERA_asgi_app = get_asgi_application()
application = ProtocolTypeRouter({
"http": ERA_asgi_app,
"websocket": AuthMiddlewareStack(
URLRouter(
test.routing.websocket_urlpatterns
)
),
})
routing.py
from django.urls import re_path
from test import consumers
websocket_urlpatterns = [
re_path(r'chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]
nginx.conf
location /ws/ {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_redirect off;
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_pass http://0.0.0.0:8443;
}
код javascript
const roomName = JSON.parse(document.getElementById('room-name').textContent);
if (window.location.protocol === 'https:') {
var chatSocket = new WebSocket(
'wss://'
+ window.location.host
+ '/chat/'
+ roomName
+ '/'
);
} else {
var chatSocket = new WebSocket(
'ws://'
+ window.location.host
+ '/chat/'
+ roomName
+ '/'
);
}
chatSocket.onmessage = function(e) {
const data = JSON.parse(e.data);
document.querySelector('#chat-log').value += (data.message + '\n');
};
chatSocket.onclose = function(e) {
console.error('Chat socket closed unexpectedly');
};
document.querySelector('#chat-message-input').focus();
document.querySelector('#chat-message-input').onkeyup = function(e) {
if (e.keyCode === 13) { // enter, return
document.querySelector('#chat-message-submit').click();
}
};
document.querySelector('#chat-message-submit').onclick = function(e) {
const messageInputDom = document.querySelector('#chat-message-input');
const message = messageInputDom.value;
chatSocket.send(JSON.stringify({
'message': message
}));
messageInputDom.value = '';
};
Я пробовал изменить nginx.conf, заменил uvicorn на daphne, но ничего не меняется, он работает на localhost, но не в production.